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

C 创建静态全局文件的多个实例/副本,c,multithreading,ipc,extern,C,Multithreading,Ipc,Extern,不确定我是否正确地写了标题,但请耐心听我说,一切都会得到解释 我们有一组代码不是在这里发明的,它使用进程间通信(IPC消息传递)。该计划的大致轮廓如下: 通信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_i

不确定我是否正确地写了标题,但请耐心听我说,一切都会得到解释

我们有一组代码不是在这里发明的,它使用进程间通信(IPC消息传递)。该计划的大致轮廓如下:

通信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>
}
foo.c也可以:

init_messaging(ID_FOO);
get_some_data(target);
这是如何工作的/应该如何工作的/厄尔巴尼安密码奴隶似乎期望它能工作:

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

但是,如果我们遇到这种情况,从同一个地方生成的两个或多个线程都会失败:

stuff.c可能会:

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

void things_thread()
{
    init_messaging(ID_THINGS);
    get_some_data(target);
}
#include "comms.h"

void stuff_thread()
{
    our_id = ID_STUFF;
    init_messaging(our_id);
    get_some_data(target);
}
如果发生这种情况,当stuff\u线程启动时,我们的\u id被设置为id\u stuff,但当stuff\u线程启动时,我们的\u id被过度写入id\u things,因此things\u线程最终可以获取stuff\u线程的数据

现在,这显然是一个相当不可靠的方法,但我不确定这样做的正确/最坏的方法是什么,而不必向每个调用传递额外的变量来获取一些数据()等等

似乎我们需要的是“很少纠正.h”示例中提到的内容: 每个comms.h的包含都会产生一个新的\u id副本-,除了每次调用init\u messaging()时需要多个副本之外

或者让我们成为一个外人,比如: 通信h

extern int our_id;
stuff.c可能会:

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

void things_thread()
{
    init_messaging(ID_THINGS);
    get_some_data(target);
}
#include "comms.h"

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

进行了一轮搜索,所以还没有得到任何看起来优雅的答案。

给克里斯·基克的帽子提示,声明:

static __thread int our_id;

我成功了

我在考虑邮件递送服务,谢天谢地,他们有收据的名称和地址,否则,邮件可能会被递送给其他任何人。。。这同样适用于你的应用程序,你不能对不同的数据使用相同的ID。我不确定我是否理解你的意思?如果你在同一进程中有多个线程,并且每个线程都有自己的消息ID,那么,IMHO最好的解决方案就是在
comms
中的所有函数原型中添加消息id。Thread local storage?@ChrisJ.Kiick-这看起来可能会有帮助,我现在就来介绍一下,并会回来报告!