一个简单进程池的实现

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.运行结果

在这里插入图片描述

这是一个忙等版本

猜你喜欢

转载自blog.csdn.net/ZZHinclude/article/details/119683990