将 "thread number" 传递给 pthread_create

Passing "thread number" to pthread_create

我正在创建一定数量的线程并分派它们来执行我创建的函数 (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);
        }

快速而肮脏的解决方案是将整数转换为指针

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 不得退出,直到线程完成数组。或者您可以将数组设为全局变量。