【发布时间】:2021-09-15 02:21:41
【问题描述】:
我正在尝试制作一个使用 3 个线程的脚本,这些线程的任务是通过管道搜索并发送到存储器,素数最多为某个 n(作为输入参数传递)。所有 3 个线程必须同时工作。 我基本上有2个问题... 首先是线程没有分析所有的数字,有些被跳过了,我不明白为什么。 第二个是,如果我启动主文件然后启动存储器,它们都保持种植状态并且没有输出。 你能帮帮我吗?
主文件
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <unistd.h>
#include <pthread.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <errno.h>
pthread_mutex_t mutex = PTHREAD_MUTEX_INITIALIZER;
int num, n ;
int fp ;
void *find_prime_number (void* name){
int *th = (int *) name;
//while(num <= n ){
int mynum;
while (pthread_mutex_lock(&mutex), mynum = num++, pthread_mutex_unlock(&mutex), mynum <= n)
{
//pthread_mutex_unlock(&mutex);
int check = 0;
////
for(int i=2 ;i<=num/2; i++ ){
if(num<=n){
if (num % i==0 ){
printf("Calc%d : %d NON è un numero primo \n", *th, num);
check=1;
break;
}
}
else{
//pthread_mutex_unlock(&mutex);
return 0 ;
}
}
/////
if (num<=n){
if(check == 0){
printf("Calc%d : %d è un numero primo , lo invio al memorizzatore\n", *th, num);
write (fp, &num , sizeof(num));
}
}
else {
// pthread_mutex_unlock(&mutex);
return 0 ;
}
if(num <= n){
// pthread_mutex_lock(&mutex);
num++;
}
// pthread_mutex_unlock(&mutex);
}
}
int main(int argc , char *argv[]){
char *fifo = "myfifo" ;
if (argc != 2 ){
printf("Errore nell'immissione dei parametri \n ");
return -1 ;
}
int error ;
n= atoi(argv[1]);
pthread_t t1 , t2 , t3 ;
pthread_t *calc_arr[3] = { &t1 , &t2 , &t3 } ; //array per l'id dei thread
if (error = mkfifo( fifo , 0666)== -1){
// printf("Errore nella pipe fifo \n");
perror(fifo);
if (errno != EEXIST){
return -1;
}
}
if ((fp = open(fifo, O_RDONLY))==-1 ){
perror(fifo);
//if (errno != EEXIST)
//return -1 ;
return 1;
}
int thread[]= {1,2,3};
for(int i = 0; i<3 ; i++ ){
if(error = pthread_create(calc_arr[i], NULL,find_prime_number,&thread[i]) != 0 ){
perror("Errore nella creazione dei thread");
exit(1);
}
}
for (int i = 0; i < 3 ; i++){
if (error=pthread_join(*calc_arr[i], NULL )!= 0 ){
perror("Errore nel join dei thread ");
exit(1);
}
}
close(fp);
printf("Terminazione dei calcolatori \n");
return 0 ;
}
存储器
#include <fcntl.h>
#include <stdio.h>
#include <stdlib.h>
#include <sys/stat.h>
#include <unistd.h>
#define MAX_BUF 1024
#define MAX_PID 8
int main()
{
int fd ;
int bytesread;
char * myfifo = "myfifo";
char buf[MAX_BUF];
fd = open( myfifo, O_RDONLY );
while(1)
{
if((bytesread = read( fd, buf, MAX_BUF - 1)) > 0)
{
buf[bytesread] = '\0';
printf("Received: %s\n", buf);
}
else
break;
}
close(fd);
return 0;
}
【问题讨论】:
-
修复缩进。更多的人会愿意看代码。
标签: c multithreading pipe fifo