一尘不染

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

linux

我有一个main.c,其全局变量名为int countboards。在main()中,我启动一个pthread,它侦听一个TCP连接并通过(progserver.c)运行该线程。意味着,该线程将永远不会返回。在main()中,输入rmmain(...)rm.c(RM
=资源管理器)中的函数。在rm.c中,我countboards在pthread的progserver.c中读取了此变量的内容(两者均可通过进行访问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
}

阅读 340

收藏
2020-06-03

共1个答案

一尘不染

您正在每个线程中看到一个缓存的副本。我建议声明一下,volatile int countboards除非那确实不是解决问题的好方法。

全球人有点邪恶。将指针传递给每个线程并与互斥锁进行同步会更好。

编辑: 为了扩大这一点,因为我昨晚很着急…

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

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

2020-06-03