C 分离的螺纹不';我不能同时跑

C 分离的螺纹不';我不能同时跑,c,multithreading,C,Multithreading,嘿,我想创建一个多线程程序。第一个线程从std-in接收输入,并将其存储在minheap中。第二个线程。。。现在,它所做的只是打印“sequencer thread works”,其他什么都没有,因为它运行不正常 两个线程都是分离的,因此它们应该同时运行,但是由于某种原因,第二个线程直到第一个线程退出后才运行。是不是我忽略了一些简单的事情?我是多线程新手 谢谢 #include <stdio.h> #include <stdlib.h> #include <pthr

嘿,我想创建一个多线程程序。第一个线程从std-in接收输入,并将其存储在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);
    }
#包括
#包括
#包括
#包括
#包括
#包括
#包括
#包括“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编译)。警告的存在是有原因的。