#include <pthread.h> #include <stdio.h> #include <sys/time.h> #include <string.h> #define MAX 10 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 < MAX; i++) { printf("thread1 : number = %d\n",number); pthread_mutex_lock(&mut); number++; pthread_mutex_unlock(&mut); sleep(2); } printf("thread1 :主函數在等我完成任務嗎?\n"); pthread_exit(NULL); } void *thread2() { printf("thread2 : I'm thread 2\n"); for (i = 0; i < MAX; i++) { printf("thread2 : number = %d\n",number); pthread_mutex_lock(&mut); number++; pthread_mutex_unlock(&mut); sleep(3); } printf("thread2 :主函數在等我完成任務嗎?\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) //comment2 printf("線程1創建失敗!\n"); else printf("線程1被創建\n"); if((temp = pthread_create(&thread[1], NULL, thread2, NULL)) != 0) //comment3 printf("線程2創建失敗"); else printf("線程2被創建\n"); } void thread_wait(void) { /*等待線程結束*/ if(thread[0] !=0) { //comment4 pthread_join(thread[0],NULL); printf("線程1已經結束\n"); } if(thread[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(); return 0; }
執行結果
我是主函數哦,我正在創建線程,呵呵 線程1被創建 線程2被創建 我是主函數哦,我正在等待線程完成任務阿,呵呵 thread1 : I'm thread 1 thread1 : number = 0 thread2 : I'm thread 2 thread2 : number = 1 thread1 : number = 2 thread2 : number = 3 thread1 : number = 4 thread2 : number = 5 thread1 : number = 6 thread1 : number = 7 thread2 : number = 8 thread1 : number = 9 thread2 : number = 10 thread1 :主函數在等我完成任務嗎? 線程1已經結束 thread2 :主函數在等我完成任務嗎? 線程2已經結束
下面一個稍微復雜的多線程
extern int pthread_join __P ((pthread_t __th, void **__thread_return));
第一個參數為被等待的線程標識符,第二個參數為一個用戶定義的指針,它可以用來存儲被等待線程的返回值。這個函數是一個線程阻塞的函數,調用它的線程將一直等待到被等待的線程結束為止,當函數返回時,被等待線程的資源被收回。一個線程的結束有兩種途徑,一種是象我們上面的例子一樣,函數結束了,調用它的線程也就結束了;另一種方式是通過函數pthread_exit來實現。它的函數原型為:
extern void pthread_exit __P ((void *__retval)) __attribute__ ((__noreturn__));
唯一的參數是函數的返回代碼,只要pthread_exit中的參數retval不是NULL,這個值將被傳遞給 thread_return。最后要說明的是,一個線程不能被多個線程等待,否則第一個接收到信號的線程成功返回,其余調用pthread_join的線程則返回錯誤代碼ESRCH。
實例:
#include <stdio.h> #include <pthread.h> #include <stdlib.h> pthread_t tid1, tid2; void *tret; void * thr_fn1(void *arg) { sleep(1);//睡眠一秒,等待TID2結束。 pthread_join(tid2, &tret);//tid1一直阻賽,等到tid2的退出,獲得TID2的退出碼 printf("thread 2 exit code %d\n", (int)tret); printf("thread 1 returning\n"); return((void *)2); } void * thr_fn2(void *arg) { printf("thread 2 exiting\n"); pthread_exit((void *)3); } int main(void) { int err; err = pthread_create(&tid1, NULL, thr_fn1, NULL); if (err != 0) printf("can't create thread 1\n"); err = pthread_create(&tid2, NULL, thr_fn2, NULL); if (err != 0) printf("can't create thread 2\n"); err = pthread_join(tid1, &tret);//祝線程一直阻賽,等待TID1的返回。 if (err != 0) printf("can't join with thread 1\n"); printf("thread 1 exit code %d\n", (int)tret); //err = pthread_join(tid2, &tret); //if (err != 0) // printf("can't join with thread 2\n"); // printf("thread 2 exit code %d\n", (int)tret); exit(0); } 命令:#gcc -lthread myfile11-3.c :#./a.out 運行結果: thread 2 exiting thread 2 exit code 3 thread 1 returning thread 1 exit code 2