【发布时间】: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