并发多线程

时间:2016-11-06 11:26:02

标签: c multithreading pthreads

我正在努力了解多线程的工作原理。我写了以下代码 `

void handler(void *arg)
{
    printf("Printf from cleanup handler: %s\n", (char*)arg);
}

void print(const char *msg)
{
    printf("%7s: Pid=%d Tid:%lu\n", msg, getpid(), pthread_self());
}

void* thread_function1(void *args)
{
    printf("Received: %d\n", (int)args);
    print("Thread");
    pthread_cleanup_push(handler, "hello");
    pthread_cleanup_pop(1);
    printf("Thread Done\n");    
    return (void *) 0;
}

int main(void)
{
    pthread_t tid1, tid2;
    void *tret;
    if(pthread_create(&tid1, NULL, thread_function1, (void *)1))
        exit(1);
    if(pthread_create(&tid2, NULL, thread_function1, (void *)2))
        exit(1);
//  pthread_join(tid2, &tret);
//  pthread_join(tid1, &tret);
}

此代码的问题是主要在thread_function1完成执行之前完成其执行。如果两个注释都被删除,则thread 2仅在thread 1完成执行后执行。

我想要做的是同时执行thread 1thread 2main应该等待两个线程的完成。

1 个答案:

答案 0 :(得分:5)

  

这段代码的问题在于,在thread_function1完成执行之前,main完成了它的执行。

那是因为当主线程退出时,进程会死亡,包括所有线程。您可以从主线程调用pthread_exit(0),以便其余线程继续执行并退出主线程。

  

如果两个注释都被删除,那么只有在线程1完成执行后才执行线程2。

那不是真的。即tid1tid2在创建后同时执行(“同时执行”取决于您的硬件,调度策略等 - 但就您的程序而言,它们可被视为正在执行同时)。 pthread_join()不控制线程执行的顺序。它只影响主线程等待完成线程的顺序,即主线程先等待tid2先完成,然后等待tid1(如果你是注释)那两行)。