pthread使用

来源:互联网 发布:闲鱼怎么申请淘宝介入 编辑:程序博客网 时间:2024/06/08 10:19

pthread_t

  • pthread_t用于表示Thread ID,具体内容根据实现的不同而不同,有可能是一个Structure,因此不能将其看作为整数
  • pthread_equal函数用于比较两个pthread_t是否相等
int pthread_equal(pthread_t tid1, pthread_t tid2)

pthread_create

int pthread_create(       pthread_t *restrict tidp,       const pthread_attr_t *restrict attr,       void *(*start_rtn)(void *), void *restrict arg);

a. pthread_t *restrict tidp:返回最后创建出来的Thread的Thread ID
b. const pthread_attr_t *restrict attr:指定线程的Attributes,包括detach state,是否joinable,cancel state,cancel type等等
c. void (*start_rtn)(void ):指定线程函数指针,该函数返回一个void ,参数也为void
d. void *restrict arg:传入给线程函数的参数
e. 返回错误值。当且仅当返回值为0时,表示成功创建。

pthread_kill

int pthread_kill(pthread_t thread, int sig);
  • 别被名字吓到,pthread_kill可不是kill,而是向线程发送signal。pthread_kill函数向指定ID的线程发送sig信号。
  • 如果线程代码内不做处理,或者说没有实现signal处理函数,则按照信号默认的行为影响整个进程。例如,pthread_kill(threadid, SIGKILL)杀死进程,pthread_kill(threadid, SIGQUIT)使进程退出,而如果线程内实现了signal(SIGKILL,sig_handler)或signal(SIGQUIT,sig_handler),就会按照sig_handler指定的处理方式进行了。
  • 传递的pthread_kill的signal参数一般都是大于0的,这时系统默认或者自定义的都是有相应的处理程序。signal为0时,是一个被保留的信号,一般用这个保留的信号测试线程是否存在。
  • pthread_kill返回值:
    0: 调用成功。
    ESRCH:线程不存在。
    EINVAL:信号不合法。
int kill_rc = pthread_kill(thread_id,0);if(kill_rc == ESRCH)printf("the specified thread did not exists or already quit\n");else if(kill_rc == EINVAL)printf("signal is invalid\n");elseprintf("the specified thread is alive\n");

pthread_join

int pthread_join(pthread_t tid, void **status);

功能:pthread_join()函数会一直阻塞调用线程,直到指定的线程tid终止。当pthread_join()返回之后,应用程序可回收与已终止线程关联的任何数据存储空间(另外也可设置线程attr属性,当线程结束时直接回收资源)。如果没有必要等待特定的线程终止之后才进行其他处理,则应当将该线程分离pthread_detach()。

参数:
tid:需要等待的线程,指定的线程必须位于当前的进程中,而且不得是分离线程
status:线程tid所执行的函数start_routine的返回值(start_routine返回值地址需要保证有效),其中status可以为nullptr

返回值:
调用成功完成后,pthrea_join()返回0,其他任何返回值都表示出现了错误。

原创粉丝点击