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

标签 c linux pthreads global-variables posix

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

程序服务器.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
}

最佳答案

您会在每个线程中看到一个缓存的副本。我建议将其声明为 volatile int countboards,但这确实不是一个好方法。

全局变量有点邪恶。通过向每个线程传递一个指针并与互斥锁进行同步,您会得到更好的服务。

编辑:由于我昨晚很匆忙,所以要对此进行扩展......

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

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

关于c - 访问不同 c 文件中 pthread 中的全局变量,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7382636/

相关文章:

c - linux 用户级(pthread)线程是否在多个内核上运行?

c++ - 在 C++11 中为 pthread 设置调度参数

c - 建议分布式计算,从流中获取数据

c程序输出说明

c - long long int 数的模数

c - 为什么 realloc 不缩小数组?

linux - shell 脚本 : pacmd: no command found

python - 如何在 python 脚本中从 .env 文件设置环境变量?

linux - 使用 Perl 的高性能套接字服务器

c - 主线程退出时,其他线程是否也退出?