Windows线程奇怪的行为

时间:2017-09-17 09:33:44

标签: c multithreading while-loop gtk winsock

我正在将GTK +,WinAPI和Winsock结合起来创建一个图形客户端 - 服务器界面,一个等候室。 nUsers是一个变量,用于确定成功连接的客户端数量。

在Windows线程中,由:

创建
CreateThread(NULL, 0, action_to_users, NULL, 0, NULL);

我使用do-nothing while循环,以便在用户连接之前冻结。

while(!nUsers);

然而,它永远不会通过循环,好像nUsers永远不会变成> 0。nUsers计算正确连接的客户端数量,因为我会不断监控它并在各种不同的功能中使用它。 为了证明我的观点,甚至发生了一些奇怪的事情。 如果我做循环

while(!nUsers) { printf("(%i)\n", nUsers); }

要打开带有文本的控制台(只要它不是空字符串,无关紧要),它就可以正常工作。

这可能会发生什么......

1 个答案:

答案 0 :(得分:1)

关于原始问题:编译器可以自由地缓存nUsers的值,因为在此循环中未修改变量。标记变量volatile会阻止此优化,如here所述。

关于你想要实现的目标 - 它看起来像生产者 - 消费者模式,其中处理套接字的线程是生产者,而你的GUI线程是消费者。您可以将消费者循环减慢到仅在新数据可用时循环:

  • semaphores as showcased here - 生产者线程增量计入信号量,而消费者在出列工作项时减少它。
  • Events like here - 生产者线程在消费者线程等待其发出信号时发出信号。您可以将工作排入某个队列,以允许处理多个项目。
  • Condition variables (XP+) - 在这里,您正在等待的变量会在满足某些条件时发出信号。