Доступ к глобальным переменным в pthreads в разных c-файлах

У меня есть main.c с глобальной переменной, называемой int countboards . В основном () я запускаю pthread, который слушает ONE TCP-Connection и запускает его через (progserver.c). Значит, эта нить никогда не вернется. В main () я ввожу функцию rmmain(...) которая находится в rm.c (RM = Ressource Manager). В rm.c я читаю countboards , в progserver.c в pthread я пишу эту переменную (оба сделаны доступными для extern int countboards ).

Поэтому проблема заключается в том, что когда я пишу в countboards в pthread, и я хочу получить доступ к этой переменной после того, как она была записана в rm.c, она все еще имеет старое значение (в данном случае 0 вместо примера 10). Зачем?

main.c:

 int countboards; int main(int argc, char** argv) { countboards = 0; pthread_t thread; pthread_create(&thread, NULL, startProgramserver, NULL); rmmain(); return 0; } 

rm.c:

 extern int countboards; int rmmain(vhbuser* vhbuserlist, int countvhbuser, userio* useriolist, int countios, int usertorm, int rmtosslserver, int sslservertorm) { while(1) { int n; n=read(usertorm,buf,bufc); // blocks until command comes from the user ... board* b = findAFreeBoard(boardlist, countboards, usagelist); // here countboards should be >0, but it isn't ... } } 

programserver.c:

 extern int countboards; void* startProgramserver(void*) { ... sock = tcp_listen(); ... http_serve(ssl,s, sslpipes); } static int http_serve(SSL *ssl, int s, void* sslpipes) { ... countboards = countboards + countboardscommands; ... // here countboards has the new value } 

Вы видите кешированную копию в каждом streamе. Я бы предложил объявить его volatile int countboards за исключением того, что на самом деле это не очень хороший способ заниматься вещами.

Глобалы – это зло. Вам лучше обслуживать, передавая указатель на каждый stream и синхронизируя с мьютексом.

Изменить: Чтобы расширить это, так как я спешил вчера вечером …

http://software.intel.com/en-us/blogs/2007/11/30/volatile-almost-useless-for-multi-threaded-programming/

Как упоминает KasigiYabu в комментариях ниже, создание «контекстной» структуры, которая содержит всю информацию, которую вы хотите разделить между streamами, и передавать ее в pthread_create поскольку последний аргумент является обоснованным подходом, и это то, что я делаю также в большинстве случаев ,