日期:2014-05-16 浏览次数:20897 次
下面我们将上面两个线程进行同步。
?
#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