【问题标题】:Problem with pipe and multithreading comunication [C]管道和多线程通信问题 [C]
【发布时间】: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


【解决方案1】:

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

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", *th, 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。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-07-05
    • 2011-08-06
    • 2017-11-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多