pthread线程包常用函数,pthread多线程编程

pthread线程包常用函数,pthread多线程编程,关于C语言多线程pthread库的相关函数说明

下面小编就为大家带来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的观点,版权归原作者所有,仅为传播更多信息之目的,如有侵权请联系,我们将第一时间修改或删除,多谢。

留言与评论(共有 条评论)
   
验证码: