如果您展示了如何Tparam
声明它可能会有所帮助。
但是,如果您希望每个线程都有自己的空间来存储一些数据,那么您可以安排将该空间作为函数的参数传递给线程。例如:
enum { NTHREADS = 10 };
struct TLS_Data
{
int id;
char buffer[2048];
size_t index;
} data[NTHREADS];
for (int c1 = 0; c < NTHREADS; c1++)
{
data[c1].index = c1;
data[c1].id = 0;
data[c1].buffer[0] = '\0';
int rc = pthread_create(&threads[c1], NULL, Thread_Pool, &data[c1]);
...handle errors, etc...
}
注意 ; 的最后一个参数没有强制转换pthread_create()
。void *
当范围内有原型时,没有必要将指针转换为。
在您的Thread_Pool
中,您似乎想将参数视为整数;这也可以做到。传递一个指向整数的指针是最干净的;如果你真的坚持,你可以直接传递整数值:
uintptr_t value = c1 + 10;
rc = pthread_create(&threads[c1], NULL, Thread_Pool, (void *)value);
因为value
is的类型uintptr_t
,你知道它能够保存一个 void 指针,所以它为你提供了最大的工作机会。但是您正在与类型系统作斗争,这使得编写干净的代码变得更加困难。
Thread_Pool()
要注意的一件事是,如果应该看到不同的值,您需要确保传递给线程函数(在您的示例中)的数据不会在线程之间共享。无法保证线程执行的顺序,所以如果你犯了如下错误:
uintptr_t value = c1 + 10;
rc = pthread_create(&threads[c1], NULL, Thread_Pool, &value);
(并且该代码处于循环中),则无法保证每个线程函数会看到什么。要小心!