2014-01-31 4 views
2

Не уверен, что если я сформулированный заголовок правильно, но медведь со мной, и все будет объяснено ...Создания нескольких экземпляров/копия статического глобального

У нас есть коллекция коды не изобретенную здесь, который использует межпроцессные коммуникации (обмен сообщениями 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» еще не принесли никаких изящных ответов.

+0

Я подумываю о службе доставки почты, спасибо, что у них есть имя и адрес квитанции, в противном случае почта может быть доставлена ​​кому-либо еще ... То же самое касается вашего приложения, вы не можете использовать тот же ID для разные данные. –

+0

Я не уверен, что получаю ваш смысл? –

+0

Если у вас есть несколько потоков ** в одном процессе **, и у каждого потока есть собственный идентификатор обмена сообщениями, то лучшим решением IMHO является добавление идентификатора обмена сообщениями ко всем прототипам функций в 'comms'. –

ответ

0

Hat tip to ChrisJ.Kiick, объявив:

static __thread int our_id; 

Удалось!

Смежные вопросы