Posix / Thread with join

时间:2012-05-18 20:50:40

标签: pthreads

我读了一本书,它提供了下一个代码:

void *printme(void *id) {
    int *i;
    i = (int *)id;
    printf("Hi. I'm thread %d\n", *i);
    return NULL;
}

void main() {
    int i, vals[4];
    pthread_t tids[4];
    void *retval;
    for (i = 0; i < 4; i++) {
        vals[i] = i;
        pthread_create(tids+i, NULL, printme, vals+i);
    }
    for (i = 0; i < 4; i++) {
        printf("Trying to join with tid%d\n", i);
        pthread_join(tids[i], &retval);
        printf("Joined with tid%d\n", i);
    }
}

以及下一个可能的输出:

Trying to join with tid0 
Hi. I'm thread 0 
Hi. I'm thread 1 
Hi. I'm thread 2 
Hi. I'm thread 3 
Joined with tid0 
Trying to join with tid1 
Joined with tid1 
Trying to join with tid2 
Joined with tid2 
Trying to join with tid3 
Joined with tid3

我不明白怎么可能。我们从主线程开始,创建4个线程:tids[0]... tids[3]。然后,我们暂停执行(通过join指令):主线程将等待tids[0]将停止执行,tids[0]将等待tids[1],依此类推。

所以输出应该是:

Hi. I'm thread 0 
Hi. I'm thread 1 
Hi. I'm thread 2 
Hi. I'm thread 3 
Trying to join with tid0 
Trying to join with tid1 
Joined with tid0 
Trying to join with tid2 
Joined with tid1 
Trying to join with tid3 
Joined with tid2 
Joined with tid3

我觉得我不明白一些非常基本的东西。感谢。

2 个答案:

答案 0 :(得分:2)

当您创建新线程pthread_create时,线程#1和main都会并行工作。 Main转到下一条指令phtread_join并挂起直到#1线程完成。这就是为什么你要尝试加入tid0,那么你好我是线程#1。

请注意主线程将按指定的顺序连接子线程。这意味着当你有线程#1,线程#2和线程#3和线程1需要10秒执行时,线程2需要6秒执行而线程3需要7秒才能执行,然后第一次加入将在10之后执行秒,然后在几毫秒内你应该有下一个连接,因为所有其他线程应该完成他们的工作。

答案 1 :(得分:2)

我认为您遗失的是pthread_createfork非常不同。创建的线程从提供的函数(在本例中为printme)开始,并在函数返回后立即退出。因此,新创建的线程都没有到达第二个for循环。