【发布时间】:2021-09-13 10:41:36
【问题描述】:
我声明我最近一直在使用C语言,所以我不是很了解...... 我正在制作一个脚本,它使用 3 个并行运行的线程,因此同时查找素数,直到作为参数传递的数字 n。到目前为止,我相信我没有犯任何错误,至少我认为,如果没有,请向我报告。然后我必须将这些质数存储在一个存储器文件(这是一个名为 memorizer.c 的简单文件)中,每行一个,按升序排列。存储必须由完全独立于线程的另一个进程完成。 我遇到的问题是创建管道时出错。 不知道其他的好不好。。。。 你能帮帮我吗?
#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>
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 check = 0;
for(int i=2 ;i<=num/2; i++ ){
if(num<=n){
if (num % i==0 ){
printf("Thread %d : %d , IS NOT a prime number \n", *th, num);
check=1;
break;
}
}
else{
pthread_mutex_unlock(&mutex);
return 0 ;
}
}
if (num<=n){
if(check == 0){
printf("Tread %d : %d IS a prime number , sent to memorizer\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 = "memorizer.c" ;
if (argc != 2 ){
printf("error in entering parameters \n ");
return -1 ;
}
int error ;
n= atoi(argv[1]);
pthread_t t1 , t2 , t3 ;
pthread_t *calc_arr[3] = { &t1 , &t2 , &t3 } ;
if (error = mkfifo( fifo , 0666)== -1){
printf("Error pipe fifo \n");
return -1;
}
if ((fp = open(fifo, O_WRONLY))==-1 ){
printf("Error opening pipe\n");
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 creation thread");
exit(1);
}
}
for (int i = 0; i < 3 ; i++){
if (error=pthread_join(*calc_arr[i], NULL )!= 0 ){
perror("Error join thread ");
exit(1);
}
}
close(fp);
printf("Threads termination ");
return 0 ;
}
【问题讨论】:
-
请edit您的问题一致地重新缩进代码。这将使它更容易阅读和理解。
-
char *fifo = "memorizer.c"缺少;- 这甚至可以为您编译吗? -
不,它总是在创建管道时给我一个错误
-
@LucaLucazzo 如果你不能编译你的代码,你就不能运行你的程序。
-
您看到的所有发布的代码都有一致的间距和缩进是有原因的:这使得代码更易于阅读和理解。像您发布的那样不一致的格式,到处都是大括号,随机插入空行,不同级别的缩进,所有这些都使代码几乎无法阅读。花点时间使您的代码具有可读性,并具有一致的格式。当您可以看到正在执行的操作时,编写可工作的多线程代码已经够难的了。你用令人困惑的格式挖了你的眼睛,这可能导致你无法让它工作
标签: c multithreading pipe