线程池筛质数
多线程通过竞争获取数据计算是否为质数。
例程:pthread_pool_busy.c
#include <stdio.h>
#include <stdlib.h>
#include <pthread.h>
#include <string.h>
#define LEFT 30000000
#define RIGHT 30000200
#define THRNUM 4
static pthread_mutex_t mut = PTHREAD_MUTEX_INITIALIZER; //初始化互斥量
static int num=0;
static void *p_func(void *p);
/*
* > 0 //可用数据
* = 0 //等待数据
* = -1 //数据计算完毕
*/
int main()
{
int i,err;
pthread_t tid[THRNUM]; //线程数组
for(i=0;i<4;i++)
{
err = pthread_create(tid+i,NULL,p_func,(void *)i); //创建线程
if(err)
{
fprintf(stderr,"pthread_create():%s\n",strerror(err));
exit(1);
}
}
for(i=LEFT;i<=RIGHT;i++) //循环输出数据
{
pthread_mutex_lock(&mut); //操作数据前上锁
while(num !=0)
{
pthread_mutex_unlock(&mut); //数据未被取走时解锁
sched_yield(); //出让调度器
pthread_mutex_lock(&mut); //加锁
}
num = i;
pthread_mutex_unlock(&mut); //操作完解锁
}
pthread_mutex_lock(&mut); //加锁
while(num !=0)
{
pthread_mutex_unlock(&mut); //数据未被取走解锁
sched_yield(); //出让调度器
pthread_mutex_lock(&mut); //解锁
}
num =-1;
pthread_mutex_unlock(&mut); //解锁
for(i=0;i<4;i++)
{
pthread_join(tid[i],NULL); //等待线程结束
}
pthread_mutex_destroy(&mut); //销毁互斥锁
exit(0);
}
static void *p_func(void *p)
{
int j,mark;
int i;
while(1)
{
pthread_mutex_lock(&mut); //加锁
while(num==0)
{
pthread_mutex_unlock(&mut); //未给数据时解锁
sched_yield(); //出让调度器
pthread_mutex_lock(&mut); //加锁
}
if(num ==-1)
{
pthread_mutex_unlock(&mut); //任务完成解锁退出
break;
}
i = num;
num =0;
pthread_mutex_unlock(&mut); //解锁
mark =0;
for(j=2;j<i/2;j++)
{
if(i%j ==0)
{
mark =1;
break;
}
}
if(mark ==0)
printf("[%d]%d is primer\n",(int)p,i);
}
pthread_exit(NULL); //退出线程
}
编译文件:Makefile
CFLAGS +=-pthread
LDFLAGS +=-pthread
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 分享一个免费、快速、无限量使用的满血 DeepSeek R1 模型,支持深度思考和联网搜索!
· 基于 Docker 搭建 FRP 内网穿透开源项目(很简单哒)
· 25岁的心里话
· ollama系列01:轻松3步本地部署deepseek,普通电脑可用
· 按钮权限的设计及实现