如何解决管道和多线程通信问题 [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 举报,一经查实,本站将立刻删除。