在不同的c文件中访问pthread中的全局variables

我有一个叫做int countboards的全局variables。 在main()中,我启动一个pthread,它监听一个TCP连接并通过(progserver.c)运行。 手段,这个线程将永远不会返回。 在main()中inputrm.c(RM = Ressource Manager)中的函数rmmain(...) )。 在rm.c中,我读取了countboards ,在pthread的progserver.c中,我写入了这个variables(两者都可以通过extern int countboards访问)。

所以问题是,当我写入pthread中的countboards时,我想在countboards中写入该variables之后访问这个variables,它仍然具有旧的值(在这种情况下为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 } 

Solutions Collecting From Web of "在不同的c文件中访问pthread中的全局variables"

你看到每个线程中的缓存副本。 我会建议声明它是volatile int countboards除非这真的不是一个好办法去做事情。

全球有点邪恶。 通过向每个线程传递一个指针并与一个互斥锁进行同步,可以更好地为其服务。

编辑:为了扩大这个,因为我昨晚匆匆…

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

正如KasigiYabu在下面的评论中提到的那样,创建一个“上下文”结构,包含你想在线程之间共享的所有信息,并把它作为最后一个参数传递给pthread_create ,这是一个很好的方法,而且在大多数情况下。