我正在将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); }
要打开带有文本的控制台(只要它不是空字符串,无关紧要),它就可以正常工作。
这可能会发生什么......
答案 0 :(得分:1)
关于原始问题:编译器可以自由地缓存nUsers
的值,因为在此循环中未修改变量。标记变量volatile
会阻止此优化,如here所述。
关于你想要实现的目标 - 它看起来像生产者 - 消费者模式,其中处理套接字的线程是生产者,而你的GUI线程是消费者。您可以将消费者循环减慢到仅在新数据可用时循环: