关于pthread.h的学习

来源:互联网 发布:一流网络空间安全学院 编辑:程序博客网 时间:2024/06/05 05:29

最近在学习多线程编程的课题,于是整理了一下学习到的内容。

个人是在window平台使用VS2015,附上VS引入pthread.h的教程和资源:http://blog.csdn.net/u010097616/article/details/53708718


一、首先介绍最基本的pthread_create函数:

函数原型为

int pthread_create(pthread_t *, const pthread_attr_t*, void*(*start)(void*), void*)

该函数返回值用于判断线程创建是否成功,成功则返回0

pthread_t类型用于储存线程的ID,是一个结构体,拥有p和x两个成员,其中p是指向线程函数的指针

pthread_affr_t类型是一个线程模板,它用于配置线程各个数据,比如是否可JOIN

第三个参数是线程函数

第四个参数是该线程函数的参数,没有时可以填入NULL不可省略


一个正常的使用样例如下:

void* test(void* args){}


if (ret = pthread_create(&tid2, &attr, test, (void*)&index2) != 0)

cout<<"SUCCESS\n”;


在如同上面代码调用此函数后,test与主函数会立即开始异步运行



二、设定线程模板pthread_attr_t:

pthread_attr_init(pthread_attr_t*)函数可以初始化一个默认的线程模板

pthread_attr_setdetachstate(pthread_attr_t*, int detchState)函数可以把一个模板设定为特别的分离类型



三、线程间的交流,阻断,同步问题:

一般来说,我们往往需要新的线程与主线程有着某种程度上的同步与联系。

而且如果新线程是一个不断循环的过程,那么该线程的空转对系统来说是不必要的浪费,所以我们需要在主线程中实现对副线程的控制


①JOIN连接:

int pthread_join(pthread_t *,void**)函数可以阻断当前线程直到新线程结束,并获取新线程的返回值指针

该函数只能指定JOINABLE的线程,其返回值表明是否成功,0代表成功

使用场合:

主线程可能过快结束,从而其局部变量等各个数据清空,而如果副线程依赖于这些数据,就会导致访问错误。所以可以令主线程等待副线程完成后,

再继续往下运行来避免这种情况发生。

tips:

JOIN连接和正常地调用函数十分类似。值得注意的是JOIN连接可以在线程创建后的任何位置进行。


②互斥锁pthread_mutex_t:

pthread_mutex_t类型用于定义互斥锁

互斥锁定义后要使用 int pthread_mutex_init(pthread_mutex_t*, const pthread_mutexattr_t*)函数来进行初始化

第二个参数是互斥锁模板,设为NULL即为默认模板。

互斥锁作用域不同的线程之间,它有两个相对的开关函数

pthread_mutex_lock(pthread_mutex_t*)//上锁

pthread_mutex_unlock(pthread_mutex_t*)//解锁

任意一个线程一旦运行到一个lock函数就会判断对应互斥锁是否已经上锁,如果是则会等待到这个互斥锁解锁才继续往下运行

这确保了一整段代码内(被互斥锁上锁与解锁函数夹在中间的代码段)任何时刻内都只有一个线程在运行

使用场合:

比如多条线程同时共享同一块数据区域,如果一个线程正在修改该区域的数据,另一个线程就开始使用这一部分的数据就有可能出现问题。

所以无论是修改共享区域数据还是读取共享区域数据都最好通过一个互斥锁来确保数据的正确性。

此外互斥锁还可以作为一个线程的开关使用,如果一个线程从头到尾都在一个互斥锁开合区域内,那么主城就可以利用上锁与解锁来控制线程的运行与否(这个用一个全局变量也可以解决)


③条件信号变量pthread_cond_t:

pthread_cond_t类型用于定义条件信号变量

条件信号变量定义后要用int pthread_cond_init(pthread_cond_t*, pthread_condattr_t*)函数来进行初始化

第二参数与互斥锁类似

同样类似的是,条件信号变量也有两个相对的函数

pthread_cond_signal(pthread_cond_t*)//发送信号

pthread_cond_wait(pthread_cond_t*)//等待信号

任意线程一旦运行到一个wait函数就会停下等待信号变量发出signal,此功能一般用于两个线程的相互调控

使用场合:

如果线程是循环形式,其中带有wait,则可以通过主程的signal在复数个时间点实现同步。这可以防止循环的线程的空转,提高效率。


四、空间释放:

以上的线程模板,互斥锁,条件信号变量都需要使用函数释放空间

分别是:

pthread_attr_destroy(pthread_attr_t*);
pthread_mutex_destroy(pthread_mutex_t*)  
pthread_cond_destroy(pthread_cond_t*)