嘿所以我正在尝试创建一个多线程程序。第一个线程从std输入输入并将其存储在minheap中。第二个线程......现在好了,它所做的只是打印“sequencer thread works”而没有别的,因为它运行不正常。
两个线程都是分离的,因此它们应该同时运行,但由于某种原因,第二个线程在第一个线程退出之前不会运行。这是我看到的简单吗?我是多线程的新手。
由于
#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);
}
答案 0 :(得分:5)
这一行是问题所在:
pthread_create(&ignore1, &attr, readerthread(minheap, eventlist, nowtimestamp), 0);
您在主线程上调用readerthread
并将其结果传递给pthread_create
。由于readerthread
永远不会返回,因此您甚至不会第一次拨打pthread_create
,更不用说第二次。
你需要这样称呼它:
pthread_create(&ignore1, &attr, readerthread, &readerthread_args);
其中readerthread_args
是一个封装传递给readerthread
的参数的结构。您还需要更改readerthread
以获取单个void *
参数,将其转换为readerthread_args
类型,然后解压缩args。
您的编译器应该收到一大堆警告。你记得打开它们吗?