关于pthread.h的学习

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

个人是在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*)  


  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
pthread_create() 函数是一个用于创建线程的函数,它的声明在<pthread.h>头文件中。函数的语法格式如下: int pthread_create(pthread_t *thread, const pthread_attr_t *attr, void *(*start_routine) (void *), void *arg); [1] 通过这个函数,我们可以创建一个新的线程,并指定线程的属性、线程执行的函数以及传递给线程函数的参数。 下面是一个使用pthread_create()函数的样例代码: #include <stdio.h> #include <unistd.h> //调用 sleep() 函数 #include <pthread.h> //调用 pthread_create() 函数 void *ThreadFun(void *arg) { if (arg == NULL) { printf("arg is NULL\n"); } else { printf("%s\n", (char*)arg); } return NULL; } int main() { int res; char * url = "http://www.biancheng.net"; pthread_t myThread1,myThread2; //定义两个表示线程的变量(标识符) res = pthread_create(&myThread1, NULL, ThreadFun, NULL); //创建 myThread1 线程 if (res != 0) { printf("线程创建失败"); return 0; } sleep(5); //令主线程等到 myThread1 线程执行完成 res = pthread_create(&myThread2, NULL, ThreadFun, (void*)url); //创建 myThread2 线程 if (res != 0) { printf("线程创建失败"); return 0; } sleep(5); // 令主线程等到 mythread2 线程执行完成 return 0; } [2] 在这个样例中,我们通过pthread_create()函数成功创建了两个线程,分别是myThread1和myThread2。线程函数ThreadFun用于在线程中执行具体的任务。我们可以通过传递参数给线程函数来定制不同的功能。在这个样例中,我们分别使用NULL和url作为参数传递给线程函数。 通过调用sleep()函数,我们可以让主线程等待子线程的执行完成。这样可以确保线程的执行顺序。 pthread_create()函数可以灵活地创建多个线程,通过指定不同的线程函数和参数,可以实现不同的并发操作。 [3<span class="em">1</span><span class="em">2</span><span class="em">3</span> #### 引用[.reference_title] - *1* *2* *3* [【多线程编程学习笔记3】创建线程函数pthread_create()详解](https://blog.csdn.net/qq_41854911/article/details/118718848)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v92^chatsearchT3_1"}}] [.reference_item style="max-width: 100%"] [ .reference_list ]

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值