我正在创建一组线程并调度它们来执行我创建的函数(createAndInsertCandy
)。我想将一个整数传递给线程创建函数,以跟踪在给定时间执行我的函数的线程,以便我可以在createAndInsertCandy
内打印该信息。
挑战在于我需要将参数传递给createAndInsertCandy
作为对pthread_create
函数的引用。我不知道如何做到这一点虽然我使用循环计数器来跟踪我当前正在调度的数字线程(它不会通过引用传递它)。我可以想到这个问题的几个丑陋的解决方案,但我相信我必须有一个更优雅的解决方案。我非常确定下面的解决方案是有效的,除了pthread_create
的最终参数需要作为参考。
pthread_t factoryThreads[NUM_FACTORIES];
for (int i = 0; i < NUM_FACTORIES; i++) {
pthread_t factoryThread;
factoryThreads[i] = factoryThread;
pthread_create(&factoryThreads[i], NULL, createAndInsertCandy, i+1);
}
答案 0 :(得分:2)
快速而肮脏的解决方案是将整数转换为指针
pthread_create(&factoryThreads[i], NULL, createAndInsertCandy, (void *)(i+1));
然后将指针强制转换回线程函数中的int
。
迂腐的解决方案是声明一个int
数组,在创建线程时初始化该数组。
pthread_t factoryThreads[NUM_FACTORIES];
int args[NUM_FACTORIES];
for (int i = 0; i < NUM_FACTORIES; i++) {
args[i] = i+1;
pthread_create(&factoryThreads[i], NULL, createAndInsertCandy, &args[i]);
}
请注意,args
数组必须保留在范围内,直到所有线程都检索到它们的值。因此,例如,如果数组是在main
中声明的,则main
必须不会退出,直到线程完成数组。或者你可以让数组成为一个全局变量。