C 分离的螺纹不';我不能同时跑
嘿,我想创建一个多线程程序。第一个线程从std-in接收输入,并将其存储在minheap中。第二个线程。。。现在,它所做的只是打印“sequencer thread works”,其他什么都没有,因为它运行不正常 两个线程都是分离的,因此它们应该同时运行,但是由于某种原因,第二个线程直到第一个线程退出后才运行。是不是我忽略了一些简单的事情?我是多线程新手 谢谢C 分离的螺纹不';我不能同时跑,c,multithreading,C,Multithreading,嘿,我想创建一个多线程程序。第一个线程从std-in接收输入,并将其存储在minheap中。第二个线程。。。现在,它所做的只是打印“sequencer thread works”,其他什么都没有,因为它运行不正常 两个线程都是分离的,因此它们应该同时运行,但是由于某种原因,第二个线程直到第一个线程退出后才运行。是不是我忽略了一些简单的事情?我是多线程新手 谢谢 #include <stdio.h> #include <stdlib.h> #include <pthr
#include <stdio.h>
#include <stdlib.h>
#include <pthread.h>
#include <string.h>
#include <signal.h>
#include <unistd.h>
#include <sys/time.h>
#include "MinHeap.h"
pthread_mutex_t mutex = PTHREAD_MUTEX_INITIALIZER;
void* readerthread(MinHeap minheap, char eventlist[], char timestamp[])
{
char buffer[100];
char input;
int ret, len, fd;
while(1)
{
char *choice;
choice = malloc(50*sizeof(char));
fgets(choice, 50, stdin);
printf("choice = : %s", choice);
if(checkTimestamp(choice)==0)
{
pthread_mutex_lock(&mutex);
addElement(&minheap, choice);
pthread_mutex_unlock(&mutex);
}
free(choice);
printf( "min of minheap: %s\n", getMin(&minheap));
}
void* sequencerthread()
{
printf("sequencer works\n");
fflush(stdout);
pthread_exit(0);
}
int main(int argc, char *argv[])
{
if (argv < 2)
{
printf("not enough arguments. exiting...\n");
return 1;
}
char timestamp[50];
char event[50];
char eventlist[sizeof(char)+170];
int i;
char nowtimestamp[] = "2400/001/00/00/00";
MinHeap minheap;
initializeMinHeap(&minheap, intCompare, sizeof(char)*50);
strcpy(timestamp, argv[1]);
strcpy(event, argv[2]);
pthread_t ignore1, ignore2;
pthread_attr_t attr;
pthread_attr_init(&attr);
pthread_attr_setdetachstate(&attr, PTHREAD_CREATE_DETACHED);
pthread_attr_setscope(&attr, PTHREAD_SCOPE_SYSTEM);
pthread_create(&ignore1, &attr, readerthread(minheap, eventlist, nowtimestamp), 0);
pthread_create(&ignore2, &attr, sequencerthread, 0);
pthread_attr_destroy(&attr);
pthread_exit(0);
return (EXIT_SUCCESS);
}
#包括
#包括
#包括
#包括
#包括
#包括
#包括
#包括“MinHeap.h”
pthread\u mutex\u t mutex=pthread\u mutex\u初始值设定项;
void*readerthread(MinHeap-MinHeap,char-eventlist[],char-timestamp[]))
{
字符缓冲区[100];
字符输入;
内网、内网、外网;
而(1)
{
字符*选择;
choice=malloc(50*sizeof(char));
fgets(选择,50,标准偏差);
printf(“选项=:%s”,选项);
if(checkTimestamp(选项)==0)
{
pthread_mutex_lock(&mutex);
addElement(&minheap,choice);
pthread_mutex_unlock(&mutex);
}
自由(选择);
printf(“minheap的最小值:%s\n”,getMin(&minheap));
}
void*sequencerthread()
{
printf(“sequencer works\n”);
fflush(stdout);
pthread_退出(0);
}
int main(int argc,char*argv[])
{
如果(argv<2)
{
printf(“参数不足。正在退出…\n”);
返回1;
}
字符时间戳[50];
字符事件[50];
char事件列表[sizeof(char)+170];
int i;
char nowtimestamp[]=“2400/001/00/00/00”;
小堆小堆;
初始化minheap(&minheap,intCompare,sizeof(char)*50);
strcpy(时间戳,argv[1]);
strcpy(事件,argv[2]);
pthread_t ignore1,ignore2;
pthread_attr_t attr;
pthread_attr_init(&attr);
pthread\u attr\u setdetachstate(&attr,pthread\u CREATE\u distached);
pthread_attr_setscope(&attr,pthread_SCOPE_SYSTEM);
pthread_create(&ignore1,&attr,readerthread(minheap,eventlist,nowtimstamp),0);
pthread_create(&ignore2,&attr,sequencerthread,0);
pthread_attr_destroy(&attr);
pthread_退出(0);
返回(退出成功);
}
这一行就是问题所在:
pthread_create(&ignore1, &attr, readerthread(minheap, eventlist, nowtimestamp), 0);
您正在主线程上调用readerthread
,并将其结果传递给pthread\u create
。由于readerthread
从未返回,因此您甚至从未调用过pthread\u create
,更不用说第二个了
您需要这样称呼它:
pthread_create(&ignore1, &attr, readerthread, &readerthread_args);
其中,readerthread\u args
是一个结构,它封装了要传递给readerthread
的参数。您还需要更改readerthread
以获取单个void*
参数,将其转换为readerthread\u args
的类型,然后解压缩这些参数
你应该从你的编译器中得到一大堆警告。你记得打开它们吗?线程是否分离与它们是否并发运行没有特别关系。@JohnBollinger我想连接的线程,按顺序执行?这不是pthread_join()的意思吗是吗?不。首先,连接线程和分离线程之间没有区别,而是可连接线程和分离线程之间的区别。其次,进程中的所有线程只要不被阻止,都会并发运行。
pthread\u join()
使调用线程等待指定线程终止(阻止线程的一种方式),但它不会影响其他线程的并发性。特别是,如果您的主线程连接了其他两个线程,这不会阻止其他两个线程同时运行。@JohnBollinger ahhh,感谢您的澄清!这完全有道理。谢谢您,这是我第一次尝试多线程。我不应该所有示例代码都没有像我那样传递参数。不过,我得到的警告都与线程无关。你应该养成修复所有警告的习惯(在gcc帮助中使用-Werror编译)。警告的存在是有原因的。