我不确定我的标题是否正确,但请耐心等待所有人解释......
我们有一个代码未在此处发明,它使用进程间通信(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还没有产生任何优雅的答案。
答案 0 :(得分:0)
向ChrisJ.Kiick发送小费,宣布:
static __thread int our_id;
诀窍!