姜鹏辉的个人博客 GreyNius

【C/C++】C语言的多线程使用-pthread

2019-11-21

头文件: 编译时需要加上 -lpthread

线程操作

创建线程

int pthread_create(pthread_t * thread, const pthread_arrt_t* attr,void*(*start_routine)(void *), void* arg);
  1. thread参数是新线程的标识符,为一个整型。
  2. attr参数用于设置新线程的属性。给传递NULL表示设置为默认线程属性。
  3. start_routine和arg参数分别指定新线程将运行的函数和参数。start_routine返回时,这个线程就退出了
  4. 返回值:成功返回0,失败返回错误号。

线程id的类型是thread_t,它只在当前进程中保证是唯一的,在不同的系统中thread_t这个类型有不同的实现,调用pthread_self()可以获得当前线程的id。
进程id的类型时pid_t,每个进程的id在整个系统中是唯一的,调用getpid()可以获得当前进程的id,是一个正整数值。

终止线程

线程函数return

线程的函数执行到return,线程也就随着结束了

pthread_cancel

int pthread_cancel(pthread_t thread);
  1. thread参数是目标线程的标识符。
  2. 该函数成功返回0,失败返回错误码。

pthread_exit

void pthread_exit(void * retval);
  1. retval是void *类型,其它线程可以调用pthread_join获得这个指针。需要注意,pthread_exit或者return返回的指针所指向的内存单元必须是全局的或者是由malloc分 配的,不能在线程函数的栈上分配,因为当其它线程得到这个返回指针时线程函数已经退出了。
  2. pthread_exit函数通过retval参数向线程的回收者传递其退出信息。它执行之后不会返回到调用者,且永远不会失败。

线程等待

void pthread_join(pthread_t thread,void ** retval);
  1. 调用该函数的线程将挂起等待,直到id为thread的线程终止。
  2. thread线程以不同的方法终止,通过pthread_join得到的终止状态是不同的。

分离线程

线程有两种状态,分别是

  • 可结合的(joinable)
  • 可分离的(detached)

默认线程都是可结合的,如果在线程结束的时候没有被join函数调用,那么这个线程的部分资源(堆栈和线程描述符)就没有被系统回收。如果线程是可分离的,那么在线程结束时资源会被回收。

int pthread_detach(pthread_t tid);

在使用的时候可以在主函数中pthreqd_detach(pid)或者直接在线程的函数中使用pthread_detach(pthread_self())

互斥

To be Continue…

函数列表

操作函数

  • pthread_create():创建一个线程
  • pthread_exit():终止当前线程
  • pthread_cancel():中断另外一个线程的运行
  • pthread_join():阻塞当前的线程,直到另外一个线程运行结束
  • pthread_attr_init():初始化线程的属性
  • pthread_attr_setdetachstate():设置脱离状态的属性(决定这个线程在终止时是否可以被结合)
  • pthread_attr_getdetachstate():获取脱离状态的属性
  • pthread_attr_destroy():删除线程的属性
  • pthread_kill():向线程发送一个信号

同步函数

用于 mutex 和条件变量

  • pthread_mutex_init() 初始化互斥锁
  • pthread_mutex_destroy() 删除互斥锁
  • pthread_mutex_lock():占有互斥锁(阻塞操作)
  • pthread_mutex_trylock():试图占有互斥锁(不阻塞操作)。即,当互斥锁空闲时,将占有该锁;否则,立即返回。
  • pthread_mutex_unlock(): 释放互斥锁
  • pthread_cond_init():初始化条件变量
  • pthread_cond_destroy():销毁条件变量
  • pthread_cond_signal(): 唤醒第一个调用
  • pthread_cond_wait()而进入睡眠的线程
  • pthread_cond_wait(): 等待条件变量的特殊条件发生
    Thread-local storage(或者以Pthreads术语,称作线程特有数据)
  • pthread_key_create(): 分配用于标识进程中线程特定数据的键
  • pthread_setspecific(): 为指定线程特定数据键设置线程特定绑定
  • pthread_getspecific(): 获取调用线程的键绑定,并将该绑定存储在 value 指向的位置中
  • pthread_key_delete(): 销毁现有线程特定数据键
  • pthread_attr_getschedparam();获取线程优先级
  • pthread_attr_setschedparam();设置线程优先级

工具函数

  • pthread_equal(): 对两个线程的线程标识号进行比较
  • pthread_detach(): 分离线程
  • pthread_self(): 查询线程自身线程标识号

Similar Posts

Comments