问题来源:http://blog.csdn.net/morewindows/article/details/7442333
问题描述:(原题目稍微做了下变动)
主线程启动10个子线程并将表示子线程序号的变量地址作为参数传递给子线程。子线程接收参数 --> 全局变量++ -> 输出参数和全局变量。
要求:
1.子线程输出的线程序号不能重复。
2.全局变量的输出必须递增。
下面画了个简单的示意图:
分析下这个问题的考察点,主要考察点有二个:
1.主线程创建子线程并传入一个指向变量地址的指针作参数,由于线程启动须要花费一定的时间,所以在子线程根据这个指针访问并保存数据前,主线程应等待子线程保存完毕后才能改动该参数并启动下一个线程。这涉及到主线程与子线程之间的同步。
2.子线程之间会互斥的改动和输出全局变量。要求全局变量的输出必须递增。这涉及到各子线程间的互斥。
下面我们使用信号量与互斥锁来共同实现这个功能
#include<stdio.h>
#include<pthread.h>
#include<stdlib.h>
#include<unistd.h>
#include<semaphore.h>
pthread_mutex_t g_csThreadCode;
//pthread_mutex_t g_csThreadParameter;
sem_t g_csThreadParameter;
void *Fun(void *arg);
int g_num = 0;
const int Thread_num = 50;
int main()
{
//pthread_mutex_init(&g_csThreadParameter,NULL);
pthread_mutex_init(&g_csThreadCode,NULL);
sem_init(&g_csThreadParameter,0, 1);
pthread_t id[Thread_num];
int i = 0;
int re;
while(i < Thread_num)
{
sem_wait(&g_csThreadParameter);
re = pthread_create(&id[i], NULL,Fun, &i);
//pthread_mutex_lock(&g_csThreadParameter);
i++;
}
sleep(5);
printf("exit main thread\n");
return 0;
}
void *Fun(void *arg)
{
int Threadnum = *(int *)arg;
//pthread_mutex_unlock(&g_csThreadParameter);
sem_post(&g_csThreadParameter);
sleep(0.4*(rand()%10));
pthread_mutex_lock(&g_csThreadCode);
g_num++;
printf("thread num %d global num %d\n", Threadnum, g_num);
pthread_mutex_unlock(&g_csThreadCode);
}
注意上上面信号量的初始化值,并且信号量不能用互斥锁来替代,不然又哪些问题,大家可参见我上面提到的博客。