如果您显示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
类型是uintptr_t
,你知道它是能够保持一个空指针,所以它给你的东西工作的最大机会。但是你正在与类型系统打交道,这使得编写干净的代码变得更加困难。
需要注意的一件事是,如果它们应该看到不同的值,则需要确保传递给线程函数(在您的示例中为Thread_Pool()
)的数据不在线程之间共享。没有线程的执行顺序的保障,因此,如果你犯了一个错误,如:
uintptr_t value = c1 + 10;
rc = pthread_create(&threads[c1], NULL, Thread_Pool, &value);
(和代码是在一个循环中),那么会是没有什么每个线程功能保证会看到。要小心!
pthread_keycreate等阅读文档。 – bmargulies
为什么不使用线程局部变量,使用__thread前缀?如__thread int tl_var;其次,你不能写空指针,因为它指向写保护的位置0!如果你尝试这样做,你会得到一个分段错误。 – MetallicPriest
@bmargulies我读了pthread_keycreate,我只是想知道这是否会起作用,因为我认为它更容易,并且比你的答案要好。 – CodeRed