1.要求

计算一段区间内的质数
main线程创建了4个兄弟线程,他们用一个全局变量nPool来进行通信
nPool = 0 代表计算完成需要main发布任务
nPool > 0 代表main线程任务已经发布,四个兄弟线程可以去抢任务了
nPool = -1 代表所有任务已经发布完毕了

2.代码

#define LEFT 30000000
#define RIGHT 30000200
#define SIZE 4pthread_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.运行结果

这是一个忙等版本

一个简单进程池的实现相关推荐

  1. C++ 实现一个简单内存池

    在使用内存池进行内存管理之前,通常使用new/malloc或者delete/free来申请或者释放内存.在这个过程中,系统要首先查找内部维护的内存空闲块表,并且需要根据比如LRU等内存分配算法找到合适 ...

  2. Linux多线程实践(9) --简单线程池的设计与实现

    线程池的技术背景 在面向对象编程中,创建和销毁对象是很费时间的,因为创建一个对象要获取内存资源或者其它更多资源.在Java中更是如此,虚拟机将试图跟踪每一个对象,以便能够在对象销毁后进行垃圾回收.所以 ...

  3. python的用途实例-python进程池作用展示及实例解析

    在以下的文章之中我们来了解一下什么是python中的进程池.了解一下python进程池的相关知识,以及进程池在python编程之中能起到什么样的作用. 进程池 Pool类描述了一个工作进程池,他有几种 ...

  4. python进程池pool_python多任务--进程池Pool

    进程池Pool 在利用Python进行系统管理的时候,特别是同时操作多个文件目录,或者远程控制多台主机,并行操作可以节约大量的时间.当被操作对象数目不大时,可以直接利用multiprocessing中 ...

  5. python系列——多进程之进程池(pool)

    1.如何创建一个进程池 https://www.cnblogs.com/aylin/p/5601969.html Pool类描述了一个工作进程池,他有几种不同的方法让任务卸载工作进程. 进程池内部维护 ...

  6. 如何写一个高效进程/线程池_关于高效企业测试的思考(1/6)

    如何写一个高效进程/线程池 企业中的测试仍然没有得到应有的广泛应用. 编写尤其是维护测试需要花费时间和精力,但是缩短软件测试并不是解决方案. 为了提高测试效率,应该追求哪些范围,方法和测试技术? 基于 ...

  7. python 进程池不足_python 进程池pool简单使用

    平常会经常用到多进程,可以用进程池pool来进行自动控制进程,下面介绍一下pool的简单使用. 需要主动是,在Windows上要想使用进程模块,就必须把有关进程的代码写if __name__ == ' ...

  8. Manage,管道的简单应用,进程池,队列的简单应用

    day37---Manage,管道的简单应用,进程池,队列的简单应用 今日内容: 1 生产者消费者模型 主要是为解耦 借助队列来实现生产者消费者模型 栈:先进后出(First In Last Out ...

  9. python 进程池pool简单实例

    进程池: 在利用Python进行系统管理的时候,特别是同时操作多个文件目录,或者远程控制多台主机,并行操作可以节约大量的时间.当被操作对象数目不大时,可以直接利用multiprocessing中的Pr ...

  10. python 多进程——使用进程池,多进程消费的数据)是一个队列的时候,他会自动去队列里依次取数据...

    我的mac 4核,因此每次执行的时候同时开启4个线程处理: # coding: utf-8import time from multiprocessing import Pooldef long_ti ...

最新文章

  1. 一、PyTorch Cookbook(常用代码合集)
  2. dev应用程序在其他电脑不能运行
  3. python使用matplotlib可视化跨年数值指标中位数变化率、使用pct_change函数计算变化率、年环比变化率(pct_change function)
  4. 风行未来oracle,oracle 7月份更新CVE-2020-14645 复现&利用
  5. 2020年高考西工大附中成绩分析
  6. oracle 查看 用户,用户权限,用户表空间,用户默认表空间
  7. 使用Java 8进行分组,转换和归约
  8. 11 SD配置-企业结构-分配-设置销售范围(Sales Area)
  9. c 语言调用纯汇编函数 1
  10. WorldList5
  11. JavaScript--eval
  12. gunicorn的用法
  13. 在windows上安装 chocolatey.1.1.0.nupkg
  14. 运用流体布局的html代码,div+css布局之流体浮动布局_html/css_WEB-ITnose
  15. python开根号_python的开根号
  16. Astah绘制UML图形
  17. 量子计算深化:大规模量子计算(相关论文108篇推荐)
  18. 抢答器c语言程序设计,基于单片机的智能抢答器设计与实现
  19. 2012年“Openstack中国行”活动总结与回顾
  20. 电脑电源功率不足会有什么影响

热门文章

  1. stream rabbit
  2. 基于jedis.setnx(key, value)实现分布式锁
  3. 从零开始学设计模式(五)——原型模式(Prototype Pattern)
  4. Gradle 插件Debug调试
  5. 关于STM32L100xx, STM32L151xx, STM32L152xx ,STM32L162xx 的Power Control
  6. 兔子--R.java丢失原因及解决的方法
  7. S5PV210 的IIC是四路还是三路的?原来内置一路IIC啊!
  8. NetApp收购Data Domain 当上冤大头?
  9. 微信小程序的模块化开发,提高效率第一篇
  10. centos php 安装openssl,详解Linux(centos7)下安装OpenSSL安装图文方法