我从回调函数中获取数据,例如
static char *buf;
int cb(char *c) {
// append to global var buf
append(buf, c);
return 0;
}
int foo() {
...
bar(cb); // calls cb
...
}
很明显,我每次将回调调用到全局var(buf
)时都会附加信息,因为我无法传递任何其他内容。现在问题是我需要使用POSIX使这个线程安全线程。我如何安全地检索信息?注意:我无法更改必须为cb
的{{1}}类型。
答案 0 :(得分:1)
创建一个管理缓冲区的C模块;每个线程一个。通过这种方式,您可以摆脱全局变量。
在此模块中,您需要一个将线程ID唯一映射到其缓冲区的数据结构。您可以使用哈希表。 (但是,如果您的平台的线程ID为0,1,2,3 ......,则可以使用动态[重新]分配的数组,并将线程ID作为索引;当然,如果您的应用程序执行了不要启动大量的线程。)
然后您需要像char* getBuffer()
这样的函数来执行查找。您可以在createBuffer()
返回getBuffer()
时调用NULL
。你需要逻辑来清理缓冲区,......;你会明白的。
确保修改此内部数据结构的函数是线程安全的。