【问题标题】:Creating multiple instances/copies of a static global创建静态全局的多个实例/副本
【发布时间】:2014-01-31 15:40:37
【问题描述】:

不确定我是否正确地用了标题,但请耐心等待,一切都会得到解释......

我们有一个代码集合不是在这里发明的,它使用进程间通信(IPC 消息传递)。该方案的非常粗略的轮廓是这样的:

comms.c 包含:

static int our_id;

void init_messaging(int id)
{
   our_id = id;
   Msg_Init(KEY);
}

void get_some_data_from_elsewhere(target_id)
{
   send_message(target_id, our_id); // Send to target, return to us
   rcv_message(<our_id>); // get messages addressed to <our_id>
}

那么 stuff.c 可能会:

init_messaging(ID_STUFF);
get_some_data(target);

foo.c 也可能这样做:

init_messaging(ID_FOO);
get_some_data(target);

这是如何工作的/应该工作/Elbonian Code Slaves 似乎期望它工作:

当 stuff.c 调用 init_messaging 时,our_id 设置为 ID_STUFF,并且来自该进程的任何进一步调用都将使用变量“ID_STUFF”,以确保消息队列上的回复返回到正确的进程。

但是,如果我们遇到这种情况,两个或多个线程从同一个地方产生,它就会全部崩溃:

stuff.c 可能会:

void stuff_thread()
{
    init_messaging(ID_STUFF);
    get_some_data(target);
}

void things_thread()
{
    init_messaging(ID_THINGS);
    get_some_data(target);
}

如果发生这种情况,当 stuff_thread 启动时,our_id 会设置为 ID_STUFF,但是当 things_thread 启动时,our_id 会被覆盖为 ID_THINGS,因此 things_thread 最终可以获取用于 stuff_thread 的数据。

现在,这显然是一个相当不稳定的问题,但我不确定这样做的正确/最糟糕的方法是什么,而不必为每次调用 get_some_data() 等传递一个额外的变量。

似乎我们需要的是“seldom_correct.h”示例中提到的内容: https://stackoverflow.com/a/1433387/1389218 每次包含 comms.h 都会产生一个新的 our_id 副本 - except 我们每次调用 init_messaging() 时都需要多个副本;

或者也许让our_id 成为extern,如下所示: comms.h

extern int our_id;

stuff.c 可能会:

#include "comms.h"

void stuff_thread()
{
    our_id = ID_STUFF;
    init_messaging(our_id);
    get_some_data(target);
}

进行一轮搜索尚未产生任何看起来优雅的答案。

【问题讨论】:

  • 我正在考虑邮件递送服务,感谢上帝,他们有收据的姓名和地址,否则,邮件可以递送给其他人......这同样适用于您的应用程序,您不能对不同的数据使用相同的 ID。
  • 我不确定我明白你的意思吗?
  • 如果您有多个线程在同一个进程中并且每个线程都有自己的消息 ID,那么最好的解决方案恕我直言,将消息 ID 添加到 @987654328 中的所有函数原型@.
  • 线程本地存储?
  • @ChrisJ.Kiick - 看起来它可能会有所帮助,我现在正在试一试,并会报告!

标签: c multithreading ipc extern


【解决方案1】:

向 ChrisJ.Kiick 致敬,声明:

static __thread int our_id;

成功了!

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-09-27
    • 1970-01-01
    • 1970-01-01
    • 2013-11-12
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多