具体程序如下:
#include <stdio.h>
#include <stdlib.h>
#include <pthread.h>
#include <string.h>
#define LEFT 30000000
#define RIGHT 30000200
#define THRNUM 4 //使用4个线程
static pthread_mutex_t mutex = PTHREAD_MUTEX_INITIALIZER;
static int num=0;//num =0 main 发任务,将num赋值为要求得数,num=-1,活干完了要走
static void* func(void *p){
int i;
int j;
int *t = p;//线程号
int flag;
while(1){
pthread_mutex_lock(&mutex);
while(num == 0){
pthread_mutex_unlock(&mutex);
sched_yield();//类似于sleep,但是更好,临时出让调度器
pthread_mutex_lock(&mutex);
}
if(num == -1){
pthread_mutex_unlock(&mutex);
break;
}
i = num;
num = 0;
pthread_mutex_unlock(&mutex);
flag=1;
for(j=2 ;j < i / 2;j++){
if(i % j == 0){
flag = 0;
break;
}
}
if(flag){
printf("[%d] [%d] is a primer\n",*t,i);
}
}
pthread_exit(NULL);
}
int main(){
pthread_t idt[THRNUM];
int err;
int i;
int *p;
for(i=0;i<THRNUM;i++){
p = malloc(sizeof(*p));
*p = i;
err = pthread_create(idt + i,NULL,func,p);
if(err){
//.....
fprintf(stderr,"%s\n",strerror(err));
exit(1);
}
}
//发任务
for(i=LEFT;i<=RIGHT;i++){
pthread_mutex_lock(&mutex);
while(num!=0){
pthread_mutex_unlock(&mutex);
sched_yield();
pthread_mutex_lock(&mutex);
}
num = i;
pthread_mutex_unlock(&mutex);
}
pthread_mutex_lock(&mutex);
while(num != 0){
pthread_mutex_unlock(&mutex);
sched_yield();
pthread_mutex_lock(&mutex);
}
pthread_mutex_unlock(&mutex);
// while(num != 0){
// pthread_mutex_unlock(&mutex);
// sched_yield();
// pthread_mutex_lock(&mutex);
// }
num = -1;//活干完了,准备收尸
for(i = 0;i<THRNUM;i++){
pthread_join(idt[i],NULL);
}
pthread_mutex_destroy(&mutex);
exit(0);
}
程序主要是练习对pthread_mutex_lock() 和pthread_mutex_unlock()的使用,主要用来控制num的变化。所以在有num的地方要注意加锁和解锁,要注意使用break和continue调出临界区是如果前面加了锁记得解锁。欢迎与我交流,如果觉得我的文章或程序有改进的地方,欢迎留言或者755465928@qq.com.共同进步。