Не уверен, что если я сформулированный заголовок правильно, но медведь со мной, и все будет объяснено ...Создания нескольких экземпляров/копия статического глобального
У нас есть коллекция коды не изобретенную здесь, который использует межпроцессные коммуникации (обмен сообщениями 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 Код Рабы, казалось бы ожидал, что это работает:
Когда 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, наш_ид установлен в ID_STUFF, но затем, когда начинается действие thing_thread, наш_ид переписан в ID_THINGS, поэтому things_thread может получить данные, предназначенные для stuff_thread.
Теперь ясно, что это довольно шатким, но я не уверен, что правильный/наименее худший способ сделать это без того, чтобы пройти дополнительную переменную для каждого вызова get_some_data() и т.д.
Кажется, что нам нужно что-то, что упоминалось в примере «seldom_correct.h» здесь: https://stackoverflow.com/a/1433387/1389218 Если каждое включение comms.h создаст новую копию нашего_иденья - , за исключением, мы хотим получить несколько копий за каждый раз, когда мы звоним init_messaging();
Или, возможно, сделать our_id экстерном что-то вроде этого: 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);
}
Having поиска тура SO hasn» еще не принесли никаких изящных ответов.
Я подумываю о службе доставки почты, спасибо, что у них есть имя и адрес квитанции, в противном случае почта может быть доставлена кому-либо еще ... То же самое касается вашего приложения, вы не можете использовать тот же ID для разные данные. –
Я не уверен, что получаю ваш смысл? –
Если у вас есть несколько потоков ** в одном процессе **, и у каждого потока есть собственный идентификатор обмена сообщениями, то лучшим решением IMHO является добавление идентификатора обмена сообщениями ко всем прототипам функций в 'comms'. –