Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/multithreading/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C Windows线程的异常行为_C_Multithreading_While Loop_Gtk_Winsock - Fatal编程技术网

C Windows线程的异常行为

C Windows线程的异常行为,c,multithreading,while-loop,gtk,winsock,C,Multithreading,While Loop,Gtk,Winsock,我正在结合GTK+、WinAPI和Winsock来创建一个图形化的客户机-服务器界面,一个候诊室。nUsers是一个变量,用于确定成功连接的客户端数量 在Windows线程中,由以下人员创建: CreateThread(NULL, 0, action_to_users, NULL, 0, NULL); 我使用DoNothing while循环,这样它就会冻结,直到用户连接为止 while(!nUsers); 但是,它从未通过循环,就好像nUsers从未变成>0一样。nUsers统计正确连接的

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

在Windows线程中,由以下人员创建:

CreateThread(NULL, 0, action_to_users, NULL, 0, NULL);
我使用DoNothing while循环,这样它就会冻结,直到用户连接为止

while(!nUsers);
但是,它从未通过循环,就好像nUsers从未变成>0一样。nUsers统计正确连接的客户端的数量,因为我一直在监视它,并在各种不同的函数中使用它。 为了证明我的观点,一些更奇怪的事情发生了。 如果我成功了

while(!nUsers) { printf("(%i)\n", nUsers); }
用打印出来的文本向控制台发送垃圾邮件并不重要,只要它不是空字符串,就可以按预期工作


这里可能会发生什么…

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

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

-生产者线程在信号量上增加计数,而消费者在解除工作项时减少计数。 -生产者线程向事件发出信号,而消费者线程等待事件发出信号。您可以在某个队列中对工作进行排队,以允许处理多个项目。 -在这里,您正在等待的变量在满足某些条件时发出信号。
马克·努瑟斯:你是基尼斯。它起作用了。。但是为什么..我的意思是我是一个合格的C程序员,我知道在哪里使用volatile,但是现在它看起来不像我以前知道的那种情况!努瑟斯房间取暖器。Windows有很多同步选项,需要更少的A/C,并且不会完全浪费一个内核。@MartinJames你是什么意思?我得承认我对windows线程技术还不熟悉。我依赖于函数引用。。我已经完全读过了。“处理套接字的线程是生产者,而您的GUI线程是消费者”——如果是这样,那么OP最初的“循环不做任何事情”或我们对事件的建议semas/condvar waitis都没有用——GUI事件处理程序中不能等待。在这种情况下,用于通信的go-to API是PostMessage,或者可能是PostThreadMessage。