分离的线程不会同时运行

时间:2017-03-08 20:19:59

标签: c multithreading

嘿所以我正在尝试创建一个多线程程序。第一个线程从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);
    }

1 个答案:

答案 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。

您的编译器应该收到一大堆警告。你记得打开它们吗?