日期:2014-05-16 浏览次数:20703 次
下面我们将上面两个线程进行同步。
?
#include <pthread.h> #include <stdio.h> #include <unistd.h> //初始化一个mutex(互斥体). pthread_mutex_t counter_mutex = PTHREAD_MUTEX_INITIALIZER; //define the first thread procedue. void * thread_1_pro(void * arg) { int * p_int_a=(int *) arg; while(1) { pthread_mutex_lock(&counter_mutex); printf("------------- a = %d\n",*p_int_a); (*p_int_a)++; sleep(7); printf("+++++++++++++ a = %d\n",*p_int_a); pthread_mutex_unlock(&counter_mutex); //must add this sleep, give the chance to wake up thread_2_pro. sleep(3); } } void * thread_2_pro(void * arg) { int * p_int_a=(int *) arg; while(1) { pthread_mutex_lock(&counter_mutex); printf("------------- b = %d\n",*p_int_a); (*p_int_a)++; sleep(3); printf("+++++++++++++ b = %d\n",*p_int_a); pthread_mutex_unlock(&counter_mutex); //must add this sleep, give the chance to wake up thread_1_pro. sleep(3); } } int main(int argc, char ** argv) { pthread_t tidA, tidB; int common=0; pthread_create(&tidA, NULL, &thread_1_pro, &common); pthread_create(&tidB, NULL, &thread_2_pro, &common); sleep(120); //为什么需要最下面两行呢,如果没有,12秒后,主进程结束,会自动回收线程tidA, tidB, //这两行就是主进程中的线程要等这两个分支线程结束后,才执行join后面的内容。 //pthread_join(tidA, NULL); //pthread_join(tidB, NULL); return 0; return 0; }
?? ?输出结果:
?? ?可以看到,linux多线程和java多线程几乎一摸一样的。唯一的区别,好像就是在mutex后面必须加个sleep,有更多
?? ?的机会让别的线程获得机会去执行,如果不加这个,执行结果是完全不一样的。
------------- a = 0 +++++++++++++ a = 1 ------------- b = 1 +++++++++++++ b = 2 ------------- a = 2 +++++++++++++ a = 3 ------------- b = 3 +++++++++++++ b = 4 ------------- a = 4 +++++++++++++ a = 5 ------------- b = 5 +++++++++++++ b = 6 ------------- a = 6 +++++++++++++ a = 7 ------------- b = 7 +++++++++++++ b = 8 ------------- a = 8