我有一个带有名为int countboards
的全局变量的main.c。在main()中,我启动了一个pthread,它监听ONE TCP-Connection并通过(progserver.c)运行它。意味着,这个线程永远不会回归。在main()中,我输入rm.c中的函数rmmain(...)
(RM = Ressource Manager)。在rm.c中我读了countboards
,在pthread的progserver.c中我写了这个变量(两个都可以被extern int countboards
访问)。
所以问题是,当我在pthread中写入countboards
并且我想在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
}
答案 0 :(得分:3)
您在每个帖子中都看到了缓存副本。我建议将其声明为volatile int countboards
,除非这不是一个很好的方法。
全球有点邪恶。通过将指针传递给每个线程并与互斥锁同步,可以获得更好的服务。
修改:为了扩展这一点,因为我昨晚匆忙......
正如KasigiYabu在下面的评论中提到的,创建一个“上下文”结构,其中包含您希望在线程之间共享的所有信息,并将其传递到pthread_create
,因为最后一个arg是声音在大多数情况下,我也是这样做的。