下面小编就为大家带来C语言多线程pthread库相关函数的讲解。我觉得边肖挺好的。我现在就分享给你,给你一个参考。来和边肖一起看看吧。
线程相关操作说明
一 pthread_t
Pthread_t在头文件/usr/include/bits/pthreadtypes . h中定义:
typedef无符号长整型pthread _ t;
它是线程的标识符。
二 pthread_create
pthread_create函数用于创建线程,其原型为:
extern int pthread _ create _ _ P((pthread _ t * _ _ thread,__const pthread_attr_t *__attr,
void *(*__start_routine) (void *),void * _ _ arg));
第一个参数是指向线程标识符的指针,第二个参数用于设置线程属性,第三个参数是线程运行函数的起始地址,最后一个参数是运行函数的参数。这里我们的函数线程不需要参数,所以最后一个参数设置为空指针。我们还将第二个参数设置为空指针,这将生成一个具有默认属性的线程。线程属性的设置和修改将在下一节描述。当线程创建成功时,该函数返回0。如果不为0,则线程创建失败。常见的错误返回代码是EAGAIN和EINVAL。前者表示系统限制新线程的创建,比如线程太多;后者表示第二个参数所代表的线程属性值是非法的。线程成功创建后,新创建的线程将运行参数3和4确定的函数,而原来的线程将继续运行下一行代码。
三 pthread_join pthread_exit
pthread_join函数用于等待线程结束。功能原型是:
extern int pthread _ join _ _ P((pthread _ t _ _ th,void * * _ _ thread _ return));
第一个参数是被等待线程的标识符,第二个参数是用户定义的指针,可以用来存储被等待线程的返回值。这个函数是一个线程阻塞函数。调用它的函数将一直等待,直到等待线程结束。当函数返回时,等待线程的资源将被收回。有两种方法可以结束一个线程。一种方法是,就像我们上面的例子一样,当函数结束时,调用它的线程也结束。另一种方式是通过函数pthread_exit。
它的函数原型为:
extern void pthread _ exit _ _ P((void * _ _ retval))_ _ attribute _ _(_ _ no return _ _);
的唯一参数是函数的返回代码。只要pthread_join中的第二个参数thread_return不为NULL,这个值就会传递给thread_return。最后需要注意的是,一个线程不能被多个线程等待,否则第一个收到信号的线程会成功返回,其余调用pthread_join的线程会返回错误代码ESRCH。
本节我们编写了最简单的线程,掌握了三个最常用的函数pthread_create、pthread_join和pthread_exit。下面,我们来学习一下线程的一些常见属性,以及如何设置。
互斥锁相关
互斥锁用于确保一次只有一个线程执行一段代码。
一 pthread_mutex_init
函数的作用是生成一个互斥体。NULL参数指示使用默认属性。如果需要声明某个特定属性的互斥体,必须调用函数pthread _ muteattr _ init。函数pthread _ muteattr _ setpshared和pthread _ muteattr _ settype用于设置互斥属性。前一个函数设置属性pshared,它有两个值,PTHREAD_PROCESS_PRIVATE和PTHREAD_PROCESS_SHARED。前者用于同步不同进程中的线程,后者用于同步本进程中的不同线程。在上面的例子中,我们使用默认属性PTHREAD_PROCESS_ PRIVATE。后者用于设置互斥类型。可选类型有PTHREAD_MUTEX_NORMAL、PTHREAD_MUTEX_ERRORCHECK、PTHREAD_MUTEX_RECURSIVE和PTHREAD _MUTEX_DEFAULT。它们分别定义了不同的访问和解锁机制。一般选择最后一个。
二 pthread_mutex_lock pthread_mutex_unlock pthread_delay_np
线程互斥锁声明开始用互斥锁上锁,此后的代码直至调用pthread _互斥锁解锁为止,均被上锁,即同一时间只能被一个线程调用执行。当一个线程执行到线程互斥锁处时,如果该锁此时被另一个线程使用,那此线程被阻塞,即程序将等待到另一个线程释放此互斥锁。
下面先来一个实例。我们通过创建两个线程来实现对一个数的递加。
#包括
#包括
#包括
#包括
#定义最多10个
pthread_t线程[2];
线程互斥锁
int number=0,I;
void *thread1()
{
printf('线程1:我是线程1 \ n’);
for(I=0;我最大我)
{
printf('thread1 : number=%d\n ',number);
pthread _ mutex _ lock(mut);
号码;
pthread _ mutex _ unlock(mut);
睡眠(2);
}
printf('线程1:主函数在等我完成任务吗?\ n’);
pthread_exit(空);
}
void *thread2()
{
printf('线程2:我是线程2 \ n’);
for(I=0;我最大我)
{
printf('thread2 : number=%d\n ',number);[下一页]
pthread _ mutex _ lock(mut);
号码;
pthread _ mutex _ unlock(mut);
睡眠(3);
}
printf('线程2:主函数在等我完成任务吗?\ n’);
pthread_exit(空);
}
空的线程_创建(无效)
{
内部温度;
memset(thread,0,sizeof(thread)).//注释一
/*创建线程*/
if((temp=pthread _ create(thread[0],NULL,thread1,NULL))!=0)//注释2
printf('线程一创建失败!\ n’);
其他
printf('线程一被创建\ n’);
if((temp=pthread _ create(thread[1],NULL,thread2,NULL))!=0)//注释3
printf('线程2创建失败');
其他
printf('线程2被创建\ n’);
}
空的线程_等待(无效)
{
/*等待线程结束*/
if(thread[0]!=0){//注释四
pthread_join(thread[0],NULL);
printf('线程一已经结束\ n’);
}
如果(线程[1]!=0) { //comment5
pthread_join(thread[1],NULL);
printf('线程2已经结束\ n’);
}
}
int main()
{
/*用默认属性初始化互斥锁*/
pthread_mutex_init(mut,NULL);
printf('我是主函数哦,我正在创建线程,呵呵\ n’);
thread_create()。
printf('我是主函数哦,我正在等待线程完成任务阿,呵呵\ n’);
thread_wait()。
返回0;
}
下面我们先来编译、执行一下
引文:
猎鹰@猎鹰:~/program/c/code/FTP $ gcc-LP thread-o thread _ example thread _ example。c
falcon @ falcon:~/program/c/code/FTP $ ./线程_示例
我是主函数哦,我正在创建线程,呵呵
线程一被创建
线程2被创建
我是主函数哦,我正在等待线程完成任务阿,呵呵
线程1:我是线程一
thread1 : number=0
线程2:我是线程2
线程2:数量=1
线程1:数量=2
线程2:数量=3
线程1:数量=4
线程2:数量=5
线程1:数量=6
线程1:数量=7
线程2:数量=8
线程1:数字=9
线程2:数量=10
线程1:主函数在等我完成任务吗?
线程一已经结束
线程2:主函数在等我完成任务吗?
线程2已经结束
以上这篇关于C语言多线程pthread库的相关函数说明就是小编分享给大家的全部内容了,希望能给大家一个参考,也希望大家多多支持我们。
郑重声明:本文由网友发布,不代表盛行IT的观点,版权归原作者所有,仅为传播更多信息之目的,如有侵权请联系,我们将第一时间修改或删除,多谢。