【发布时间】:2017-12-11 05:27:52
【问题描述】:
我编写了一个创建线程数的程序。该数字可以作为命令行参数传递或默认值为 5。我面临的问题是打印作为参数传递给 pthread writer 函数的线程号。
下面是我的程序:
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <pthread.h>
void *writerThread(void *args)
{
int id = *((int *)args);
printf("In thread %d\n", id);
}
int main(int argc, char *argv[])
{
int numThreads;
if(argc != 2)
numThreads = 5;
else
numThreads = atoi(argv[1]);
pthread_t *tId = (pthread_t*) malloc(sizeof(pthread_t) * numThreads);
int i;
for(i = 0; i < numThreads; i++)
{
pthread_create(&tId[i], NULL , writerThread, &i);
}
// wait for threads
for(i = 0; i < numThreads; i++)
pthread_join(tId[i], NULL);
if(tId)
free(tId);
return 0;
}
输出:
In thread 2
In thread 0
In thread 3
In thread 2
In thread 0
为什么 0 和 2 会出现两次? 任何帮助将不胜感激。
【问题讨论】:
-
您必须确保每个线程都有自己的单独变量,因为无法保证指向的数据与您在线程开始运行时预期的数据相同。所以,你需要一个线程号数组,并为每个(
int thr_num[numThreads]; … { thr_num[i] = i; pthread_create(…, &thr_num[i]); })传递一个不同的条目。而且,除非你认为线程数会非常高,否则我会使用 VLA,甚至是固定大小的数组,的pthread_t结构——类似于之前建议的thr_num数组。或者使用pthread_t和int创建一个结构数组。