创建静态全局的多个实例/副本

时间:2014-01-31 15:40:38

标签: c multithreading ipc extern

我不确定我的标题是否正确,但请耐心等待所有人解释......

我们有一个代码未在此处发明,它使用进程间通信(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,但是当thing_thread开始时,my_id被覆盖到ID_THINGS,因此thing_thread最终可以获得用于stuff_thread的数据。

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

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

或者也许让my_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);
}

搜索SO还没有产生任何优雅的答案。

1 个答案:

答案 0 :(得分:0)

向ChrisJ.Kiick发送小费,宣布:

static __thread int our_id;

诀窍!