为什么thread_id不按顺序创建?

时间:2014-12-04 01:54:21

标签: multithreading unix

我尝试创建10个线程,并输出每个胎面索引。我的代码如下所示,我想知道他们为什么重复而不是按顺序排列?

#include <stdio.h>
#include <pthread.h>
#include <stdlib.h>
#include <string.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
#include "util.h"
#include <errno.h>
#include <unistd.h>

#include <signal.h>
#include <time.h>
pthread_mutex_t request_buf_lock = PTHREAD_MUTEX_INITIALIZER;
void * worker(void *arg)
{
    int thread_id = *(int*)arg;
    //  int requests_handled = 0;
    //requests_handled = requests_handled + 1;
printf("%d\n",thread_id);
}
int main(int argc, char** argv) 
{


    pthread_t dispatchers[100];
    pthread_t workers[100];


    int i;
    int * thread_id = malloc(sizeof(int));

    for (i = 0; i < 10; i++) {
            *thread_id = i;
            pthread_create(&workers[i], NULL, worker, (void*)thread_id);
    }

    for (i = 0; i < 10; i++) {
            pthread_join(workers[i], NULL);
    }

    return 0;
}

输出结果是: 4 五 五 6 6 6 7 8 9 9

但我期望它为: 0 1 2 3 4 五 6 7 8 9

任何人有任何想法或建议吗?

1 个答案:

答案 0 :(得分:1)

所有10个线程并行执行,它们共享一个int对象,即通过调用malloc创建的对象。

当您的第一个帖子执行printf次调用时,*thread_id的值已设置为4。当printf设置为*thread_id时,您的第二个和第三个主题将执行5次调用。等等。

如果为每个线程分配一个单独的int对象(通过在循环内移动malloc调用或仅通过声明int s的数组),您将获得每个线程中唯一的线程ID。但它们仍然可能以任意顺序打印,因为线程之间没有同步。