gpt4 book ai didi

c - Windows 线程的奇怪行为

转载 作者:行者123 更新时间:2023-11-30 14:55:04 24 4
gpt4 key购买 nike

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

在 Windows 线程中,创建者:

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

我使用不执行任何操作的 while 循环,以便它卡住直到用户连接。

while(!nUsers);
<小时/>

但是,它永远不会通过循环,就好像 nUsers 永远不会> 0。nUsers 计算正确连接的客户端数量,因为我不断监视并使用它在各种不同的功能中。为了证明我的观点,更奇怪的事情发生了。如果我进行循环

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

用打印出来的文本(无论什么文本,只要它不是空字符串)向控制台发送垃圾邮件,它都会按预期工作。

<小时/>

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

最佳答案

关于最初的问题:编译器可以自由缓存nUsers的值,因为该变量在此循环内没有修改。标记变量 volatile 可以防止这种优化,如here所述。 .

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

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

关于c - Windows 线程的奇怪行为,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46262585/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com