C++线程常用函数

1、pthread_create( ):
函数原型:

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

创建一个具有指定参数的线程。

返回值含义:若线程创建成功,则返回0。若线程创建失败,则返回出错编号
tidp:指向线程标识符的指针。(作为参数传出,也就是pthread_t声明的变量)
attr:用来设置线程属性。(通常是NULL)
第三个参数,函数原型是void *(*start_rtn)(void*),是线程运行函数的起始地址,也就是线程运行时调用的函数
arg:给线程运行时调用的函数传递的参数

2、pthread_join( )
函数原型:

int pthread_join(pthread_t thread, void **retval);

以阻塞的形式等待线程结束,pthread_create是创建线程后执行,pthread_join让主线程阻塞,等待pthread_create创建的线程执行完毕之后,解除阻塞

返回值含义: 0代表成功。 失败,返回的则是错误号。

参数含义:
thread:线程ID,pthread_create的第一个参数
retval: 用户定义的指针,用来存储被等待线程的返回值。

 

3、pthread_exit()

void pthread_exit(void *retval);

线程函数在结束时调用此函数,以确保安全、干净地退出。

参数含义:

retval是函数的返回指针,只要pthread_join中的第二个参数retval不是NULL,这个值将被传递给retval。pthread_exit函数通过retval参数向线程的回收者传递其退出信息。他执行完之后不会返回到调用者,而且永远不会失败。

 

4、pthread_cancel()

int pthread_cancel(pthread_t thread);

取消某个线程的执行。

返回值含义:若是成功返回0,否则返回错误的编号。

参数含义:

thread是要取消线程的标识符ID。

但是,接收到取消请求的目标线程可以决定是否允许被取消以及如何取消,这分别由如下两个函数完成。

int pthread_setcancelstate(int state, int *oldstate);
int pthread_setcanceltype(int type, int *oldtype);

[pthread_setcancelstate]的第一个参数用于设置线程的取消状态(是否允许取消),第二个参数则记录线程原来的取消状态.

state参数有两个可选值:

PTHREAD_CANCEL_CNABLE,允许线程被取消。它是线程被创建时的默认取消状态。

PTHREAD_CANCEL_DISABLE,禁止线程被取消。这种情况下,如果一个线程收到取消请求,则它会将请求挂起,直到该线程允许被取消。

[pthread_setcanceltype]的第一个参数用于设置线程的取消类型(如何取消),第二个参数则记录线程原来的取消类型.

type参数也有两个可选值:

PTHREAD_CANCEL_ASYNCHRONOUS,线程随时都可以被取消。它将使得接收到取消请求的目标线程立即采取行动。

PTHREAD_CANCEL_DEFERRED,允许目标线程推迟行动,直到它调用了下面几个所谓的取消点函数中的一个:pthread_join、pthread_testcancel、pthread_cond_wait、pthread_cond_timedwait、sem_wait和sigwait。根据POSIX标准,其他可能阻塞的系统调用,比如read、wait,也可以成为取消点。不过为了安全起见,最好在可能会被取消的代码中调用pthread_testcancel函数设置取消点。

 

5、pthread_detach( )

int pthread_detach (pthread_t thread);

子线程从父线程独立出来,子线程结束后,资源自动回收

返回值含义:若是成功返回0,否则返回错误的编号。

参数含义:

thread是要释放线程的标识符ID。

说明:

其他说明:linux线程执行和windows不同,pthread有两种状态joinable状态和unjoinable状态。一个线程默认的状态是joinable,如果线程是joinable状态,当线程函数自己返回退出时或pthread_exit时,都不会释放线程所占用堆栈和线程描述符(总计8K多),只有当调用了pthread_join之后这些资源才会被释放。若是unjoinable状态的线程,这些资源在线程函数退出时或pthread_exit时自动会被释放。unjoinable属性可以在pthread_create时指定,或在线程创建后在线程中pthread_detach自己设置,如:pthread_detach(pthread_self()),将状态改为unjoinable状态,确保资源的释放。如果线程状态为joinable,需要在之后适时调用pthread_join。

6、thread_self ();
pthread_t pthread_self (void);

获取当前调用线程的线程ID。

返回值含义:当前线程的线程ID标识。

 

7、pthread_start()
开始一个线程(是一个线程处于就绪状态,具体开始时间取决于cup)

 

start、run的区别
start:

  start() 方法则是 Thread 类的方法,用来异步启动一个线程,然后主线程立刻返回。该启动的线程不会马上运行,会放到等待队列中等待 CPU 调度,只有线程真正被 CPU 调度时才会调用 run() 方法执行。即使一个线程处于就绪状态,随时由cup开始
run:

  Thread 类也是实现了 Runnable 接口,而 Runnable 接口定义了唯一的一个 run() 方法,所以基于 Thread 和 Runnable 创建多线程都需要实现 run() 方法,是多线程真正运行的主方法。

 

继承【pthread】和重写【runable】的【run方法】两种创建线程方式区别:
前者必须继承【pthread】类,调用sart方法其实最终也是调用【run】方法,【start】方法只是异步效果而对【run】的封装。

posted @ 2020-09-02 23:10  吉尔加斯  阅读(1301)  评论(0编辑  收藏  举报