Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/149.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++中的关键部分来阻塞ADS执行,同时访问共享数据,但是对于它们来说,必须在数据被阻塞之前使用,否则最好在主线程中使用它们。 那么,如果我希望我的主程序具有优先权而不被阻止,我必须使用它内部的关键部分来阻止其他线程,或者相反?_C++_Critical Section - Fatal编程技术网

线程或主程序中的关键部分更好? 我使用C++中的关键部分来阻塞ADS执行,同时访问共享数据,但是对于它们来说,必须在数据被阻塞之前使用,否则最好在主线程中使用它们。 那么,如果我希望我的主程序具有优先权而不被阻止,我必须使用它内部的关键部分来阻止其他线程,或者相反?

线程或主程序中的关键部分更好? 我使用C++中的关键部分来阻塞ADS执行,同时访问共享数据,但是对于它们来说,必须在数据被阻塞之前使用,否则最好在主线程中使用它们。 那么,如果我希望我的主程序具有优先权而不被阻止,我必须使用它内部的关键部分来阻止其他线程,或者相反?,c++,critical-section,C++,Critical Section,您似乎对什么是关键部分以及它们如何工作有相当大的误解 一般来说,临界段CS是一段需要以独占方式运行的代码,也就是说,您需要确保在任何给定时间只有一个线程在执行该段代码 由于该术语在大多数环境中使用,CS实际上是一个互斥信号量,即二进制信号量。它是一种数据结构和一组函数,用于确保代码部分以独占方式执行,而不是引用代码本身 在任何情况下,只有当/如果您有一些代码将在多个线程中执行,并且您需要确保它在任何给定时间仅在一个线程中执行时,CS才有意义。这通常是当您有一些共享数据时,如果一次有多个线程试图操

您似乎对什么是关键部分以及它们如何工作有相当大的误解

一般来说,临界段CS是一段需要以独占方式运行的代码,也就是说,您需要确保在任何给定时间只有一个线程在执行该段代码

由于该术语在大多数环境中使用,CS实际上是一个互斥信号量,即二进制信号量。它是一种数据结构和一组函数,用于确保代码部分以独占方式执行,而不是引用代码本身

在任何情况下,只有当/如果您有一些代码将在多个线程中执行,并且您需要确保它在任何给定时间仅在一个线程中执行时,CS才有意义。这通常是当您有一些共享数据时,如果一次有多个线程试图操作它,这些数据可能会被破坏。当/如果出现这种情况,您需要为每个处理该数据的线程使用critical部分,以确保共享数据不会损坏


确保特定线程保持响应是一个完全不同的问题。在大多数情况下,这意味着使用队列作为一种可能性,允许线程以最小的争用快速将任务移交给其他线程,即,在处理数据期间,CS只持续足够长的时间将数据结构放入队列,而不是使用CS,其他线程从那里开始处理。

你不能说我在线程A中使用了临界区,但在线程B中没有。临界区是一段访问共享资源的代码。当此代码从两个并行运行的线程执行时,共享资源可能会损坏,因此您需要同步对它的访问:您需要使用一些同步对象、互斥体、信号量、事件……这取决于您使用的平台和API。ThreadA锁定关键部分,因此ThreadB需要等待ThreadA释放它


如果希望主线程阻止的等待时间小于工作线程,请将工作线程优先级设置为低于主线程的优先级

boost、pthread或Win32临界区?C++没有关键的部分,所以请确定目标,并适当地重新标记。@ MZabSky:客观地说,这一说法似乎并不正确。然后如果我的主循环使用var A,并且我需要一个线程在使用A时在线程中使用一个太过进入的临界部分,那么A是不够的,因为主循环可能在使用A时被阻塞了?如果两个线程正在操作A,那么在执行此操作之前,两者都可能需要进入临界部分。如果他们都使用了很多,那么你很有可能响应时间很差。。。可以肯定的是,仅仅读取变量并不需要它?@Greg2fs:是的,如果只读取变量,就不需要互斥体/CS。好的,谢谢。我不知道我是否滥用,我可能会打开一个新主题,我的程序有问题,事实上,如果我没有使用一个线程,该程序可以完美地运行,但它在visual studio的发布和调试中运行,但不在VS之外,只需启动exe,似乎有些线程在没有完成其工作的情况下就消失了,我如何调试它?