从回调线程安全实现中检索信息

时间:2015-07-06 08:16:33

标签: c multithreading callback pthreads

我从回调函数中获取数据,例如

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}}类型。

1 个答案:

答案 0 :(得分:1)

创建一个管理缓冲区的C模块;每个线程一个。通过这种方式,您可以摆脱全局变量。

在此模块中,您需要一个将线程ID唯一映射到其缓冲区的数据结构。您可以使用哈希表。 (但是,如果您的平台的线程ID为0,1,2,3 ......,则可以使用动态[重新]分配的数组,并将线程ID作为索引;当然,如果您的应用程序执行了不要启动大量的线程。)

然后您需要像char* getBuffer()这样的函数来执行查找。您可以在createBuffer()返回getBuffer()时调用NULL。你需要逻辑来清理缓冲区,......;你会明白的。

确保修改此内部数据结构的函数是线程安全的。