2016-11-06 79 views
1

我想了解多线程如何工作。我已经写了下面的代码 `并发多线程

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 2同时执行和main应该等待两个线程完成。

+2

线程做了一个(非平凡的)工作量吗?难道是'thread_function1'在第二个线程被创建之前完成? –

+0

@WanderNauta我已经更新了这个问题。请看看它。 – Ibrahim

回答

5

该代码的问题在于,在thread_function1可以完成其执行之前,主要完成其执行。

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

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

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

+0

我得到的输出为“Received:1 \ n Printf from cleanup handler:hello \ n Received:2 \ n Printf from cleanup handler:hello” 这意味着线程2仅在线程1完成后才执行。我错过了什么吗? – Ibrahim

+0

订单不固定。尝试重复执行它几次,你可能会首先看到“收到2”,然后“收到1”。 – usr

+0

非常感谢。我试过多次运行它,它的工作原理与您所提到的完全相同。谢谢 ! :) – Ibrahim