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

时间:2011-09-12 01:53:22

标签: c linux pthreads global-variables posix

我有一个带有名为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
}

1 个答案:

答案 0 :(得分:3)

您在每个帖子中都看到了缓存副本。我建议将其声明为volatile int countboards,除非这不是一个很好的方法。

全球有点邪恶。通过将指针传递给每个线程并与互斥锁同步,可以获得更好的服务。

修改:为了扩展这一点,因为我昨晚匆忙......

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

正如KasigiYabu在下面的评论中提到的,创建一个“上下文”结构,其中包含您希望在线程之间共享的所有信息,并将其传递到pthread_create,因为最后一个arg是声音在大多数情况下,我也是这样做的。