当前位置:文档之家› 多线程编程实例---pthread_join函数详解1

多线程编程实例---pthread_join函数详解1

多线程编程实例---pthread_join函数详解1
多线程编程实例---pthread_join函数详解1

多线程编程实例---pthread_join函数详解1

单处理器上的linux多线程,是通过分时操作完成的;

此时互斥锁的作用,只有在时间足够的情况下才能体现出来,即有时线程内需要延时;

否则只有第一个线程不断解锁和获锁,别的线程在第一个线程执行完前无法获得互斥锁。三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__ ((__noreturn__));

唯一的参数是函数的返回代码,只要pthread_join中的第二个参数thread_return不是NULL,这个值将被传递给thread_return。最后要说明的是,一个线程不能被多个线程等待,否则第一个接收到信号的线程成功返回,其余调用pthread_join的线程则返回错误代码ESRCH。

在这一节里,我们编写了一个最简单的线程,并掌握了最常用的三个函数pthread_create,pthread_join和pthread_exit。下面,我们来了解线程的一些常用属性以及如何设置这些属性。

///////////////////////////////////////////////////////////////////////////

源程序:

/*thread_example.c : c multiple thread programming in linux

*/

#include

#include

#include

#define MAX1 10

#define MAX2 30

pthread_t thread[2];

pthread_mutex_t mut;

int number=0, i;

void *thread1()

{

printf ("thread1 : I'm thread 1\n");

for (i = 0; i < MAX1; i++)

{

printf("thread1 : number = %d i=%d\n",number,i);

pthread_mutex_lock(&mut);

number++;

pthread_mutex_unlock(&mut);

sleep(2);

}

printf("thread1 :Is main function waiting for me acomplishing task? \n");

pthread_exit(NULL);

}

void *thread2()

{

printf("thread2 : I'm thread 2\n");

for (i = 0; i < MAX2; i++)

{

printf("thread2 : number = %d i=%d\n",number,i);

pthread_mutex_lock(&mut);

number++;

pthread_mutex_unlock(&mut);

sleep(3);

}

printf("thread2 :Is main function waiting for me to acomplish task ?\n");

pthread_exit(NULL);

}

void thread_create(void)

{

int temp;

memset(&thread, 0, sizeof(thread)); //comment1

/*创建线程*/

if((temp = pthread_create(&thread[0], NULL, thread1, NULL)) != 0)

printf("线程1创建失败!\n");

else

printf("Thread 1 is established\n");

if((temp = pthread_create(&thread[1], NULL, thread2, NULL)) != 0) //comment3 printf("线程2创建失败");

else

printf("Thread 2 is established\n");

}

void thread_wait(void)

{

/*等待线程结束*/

if(thread[0] !=0) { //comment4

pthread_join(thread[0],NULL);

printf("Thread 1 is over \n");

}

if(thread[1] !=0) { //comment5

pthread_join(thread[1],NULL);

printf("Thread 2 is over\n");

}

}

int main()

{

/*用默认属性初始化互斥锁*/

pthread_mutex_init(&mut,NULL);

printf("I am the main funtion,and I am establishing threads. Ha-ha\n");

thread_create();

printf("I am the main funtion,and I am waiting for thread to accomplish task. Ha-ha\n");

thread_wait();

return 0;

}

///////////////////////////////////////////////////////////

执行情况1(linux终端):

[root@localhost root]# gcc -o joint joint.c -lpthread

[root@localhost root]# ./joint

I am the main funtion,and I am establishing threads. Ha-ha

thread1 : I'm thread 1

thread1 : number = 0 i=0

Thread 1 is established

thread2 : I'm thread 2

thread2 : number = 1 i=0

Thread 2 is established

I am the main funtion,and I am waiting for thread to accomplish task. Ha-ha

thread1 : number = 2 i=1

thread2 : number = 3 i=2

thread1 : number = 4 i=3

thread2 : number = 5 i=4

thread1 : number = 6 i=5

thread1 : number = 7 i=6

thread2 : number = 8 i=7

thread1 : number = 9 i=8

thread2 : number = 10 i=9

thread1 :Is main function waiting for me acomplishing task? Thread 1 is over

thread2 : number = 11 i=11

thread2 : number = 12 i=12

thread2 : number = 13 i=13

thread2 : number = 14 i=14

thread2 : number = 15 i=15

thread2 : number = 16 i=16

thread2 : number = 17 i=17

thread2 : number = 18 i=18

thread2 : number = 19 i=19

thread2 : number = 20 i=20

thread2 : number = 21 i=21

thread2 : number = 22 i=22

thread2 : number = 23 i=23

thread2 : number = 24 i=24

thread2 : number = 25 i=25

thread2 : number = 26 i=26

thread2 : number = 27 i=27

thread2 : number = 28 i=28

thread2 : number = 29 i=29

thread2 :Is main function waiting for me to acomplish task ? Thread 2 is over

相关主题
文本预览
相关文档 最新文档