我尝试创建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
任何人有任何想法或建议吗?
答案 0 :(得分:1)
所有10个线程并行执行,它们共享一个int
对象,即通过调用malloc
创建的对象。
当您的第一个帖子执行printf
次调用时,*thread_id
的值已设置为4
。当printf
设置为*thread_id
时,您的第二个和第三个主题将执行5
次调用。等等。
如果为每个线程分配一个单独的int
对象(通过在循环内移动malloc
调用或仅通过声明int
s的数组),您将获得每个线程中唯一的线程ID。但它们仍然可能以任意顺序打印,因为线程之间没有同步。