1.要求
计算一段区间内的质数
main线程创建了4个兄弟线程,他们用一个全局变量nPool来进行通信
nPool = 0 代表计算完成需要main发布任务
nPool > 0 代表main线程任务已经发布,四个兄弟线程可以去抢任务了
nPool = -1 代表所有任务已经发布完毕了
2.代码
#define LEFT 30000000
#define RIGHT 30000200
#define SIZE 4
pthread_mutex_t mutex = PTHREAD_MUTEX_INITIALIZER;
//0代表池中没有任务 >0 代表有任务 -1代表全部计算完成
int nPool = 0;
void * Fun(void *p)
{
int nNum;
int Flag;
int j;
while(1)//一直疯狂抢任务
{
Flag = 1;
//在此处加锁和被阻塞
pthread_mutex_lock(&mutex);
//如果没有发布任务 并且 任务没有被发布结束
while(0 == nPool && -1 != nPool)
{
//解锁 是为了让main线程能发布任务
pthread_mutex_unlock(&mutex);
sched_yield();
//加速为了自己抢到这个任务
pthread_mutex_lock(&mutex);
}
nNum = nPool;
nPool = 0;
pthread_mutex_unlock(&mutex);
//如果是最后一个数 或者任务已经完结了
if(RIGHT == nNum || -1 == nNum)
{
nPool = -1;
break;
}
for(j = 2; j < nNum/2; j++)
{
if(0 == nNum % j)
{
Flag = 0;
}
}
if(Flag)
{
printf("[%d] %d is a prime\n", (int)p, nNum);
}
}
printf("%d Out \n", (int )p);
pthread_exit(NULL);
}
int main()
{
pthread_t tid[SIZE];
int i,err;
//创建了4个进程
for(i = 0 ; i < SIZE; i++)
{
err = pthread_create(tid+i, NULL, Fun, (void *)i);
if(err)
{
fprintf(stderr, "create()%s ", strerror(err));
exit(1);
}
}
//main线程 发布任务
for(i = LEFT; i <= RIGHT; i++)
{
pthread_mutex_lock(&mutex);
while(0 != nPool && -1 != nPool)
{
pthread_mutex_unlock(&mutex);
sched_yield();
pthread_mutex_lock(&mutex);
}
nPool = i;
pthread_mutex_unlock(&mutex);
}
//收尸
for(i = 0; i < SIZE; i++)
{
pthread_join(tid[i], NULL);
}
//销毁锁
pthread_mutex_destroy(&mutex);
return 0;
}
3.运行结果
这是一个忙等版本