【问题标题】:Retrieve Info From Callback Thread Safe Implementation从回调线程安全实现中检索信息
【发布时间】:2015-07-06 08:16:33
【问题描述】:

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

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 的类型,它必须是int (*cb)(char *c)

【问题讨论】:

  • 您想要“安全检索”哪些“信息”?锁定append(buf, c); 不是您所需要的吗?我很困惑。
  • @meaning-matters 不会有多个线程都覆盖buf 并且锁只会阻止它同时发生吗?显然这实际上不是真正的代码,但基本上可以从cb中的c检索信息
  • 是的,所有线程都会覆盖buf。我现在更明白你想要什么了;看看here。最好对您的设计进行更广泛的了解,而不是放大似乎是问题所在;可能有不同的方式。
  • @meaning-matters 所有的答案基本上都说有比使用这些全局变通办法更好的方法。我想知道是否有更好的方法?
  • 正如我昨天建议的那样,如果你能展示更广泛的设计观点,人们可能会提出“更好的方法”。

标签: c multithreading callback pthreads


【解决方案1】:

创建一个管理缓冲区的 C 模块;每个线程一个。这样你就摆脱了全局变量。

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

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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2020-03-31
    • 1970-01-01
    • 1970-01-01
    • 2015-11-29
    • 2010-10-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多