1

我读了一本书,它给出了下一个代码:

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

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

4

2 回答 2

2

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

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

于 2012-05-18T21:25:31.240 回答
2

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

于 2012-05-18T21:27:14.690 回答