微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

管道和多线程通信问题 [C]

如何解决管道和多线程通信问题 [C]

我正在尝试制作一个使用 3 个线程的脚本,这些线程的任务是搜索并通过管道将质数发送到存储器,直到某个 n(作为输入参数传递)。所有 3 个线程必须同时工作。 我基本上有两个问题...... 首先是线程不分析所有数字,有些被跳过,我不明白为什么。 第二个是,如果我启动主文件,然后启动存储器,它们都会保持原状并且不提供任何输出。 你能帮我吗?

文件

#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",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;
}

解决方法

你的算法似乎是正确的,修复了一些代码并且它有效:

main.c

#include <errno.h>
#include <fcntl.h>
#include <pthread.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <sys/stat.h>
#include <sys/types.h>
#include <unistd.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 <= mynum / 2; i++) {
            if (mynum % i == 0) {
                printf("Calc%d : %d NON è un numero primo \n",*th,mynum);
                check = 1;
                break;
            }
        }

        if (check == 0) {
            printf("Calc%d : %d  è un numero primo,lo invio al memorizzatore\n",mynum);
            write(fp,&mynum,sizeof(mynum));
        }
    }
}

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_WRONLY)) == -1) {

        perror(fifo);
        //if (errno != EEXIST)
        //return -1 ;
        return 1;
    }

    int thread[] = { 1,2,3 };

    for (int i = 0; i < 3; i++) {
        printf("pthread_create\n");

        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;
}

memorizer.c

#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;
    char* myfifo = "myfifo";
    int num;

    fd = open(myfifo,O_RDONLY);

    while (1) {
        if ((read(fd,&num,sizeof(num))) > 0) {
            printf("Received: %d\n",num);
        } else
            break;
    }
    close(fd);

    return 0;
}

请先运行 main,然后运行 ​​memorizer。

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。