我使用临界区(在c ++中)来阻止访问共享数据时的执行,但是为了工作它们必须要等到阻塞之前没有使用数据,也许最好在main或thread中使用它们。 然后,如果我希望我的主程序具有优先权而不被阻止,我是否必须使用其中的关键部分来阻止其他线程或相反?
答案 0 :(得分:8)
你似乎对关键部分及其运作方式存在误解。
一般来说,关键部分(CS)是需要“专门”运行的一段代码 - 也就是说,您需要确保在任何给定时间只有一个线程正在执行该段代码。
由于该术语在大多数环境中使用,因此CS实际上是互斥锁 - 互斥信号量(又称二进制信号量)。它是一个数据结构(和一组函数),用于确保一段代码专门执行(而不是引用代码本身)。
在任何情况下,如果你有一些将在多个线程中执行的代码,CS只会有意义,并且你需要确保它只能在任何给定时间在一个线程中执行。这通常是当您有一些共享数据时,如果多个线程试图同时操作它,那么这些数据可能会被破坏。当/如果出现这种情况时,您需要“使用”操作该数据的每个线程的关键部分,以确保共享数据不会被破坏。
确保特定线程保持响应是一个完全独立的问题。在大多数情况下,这意味着使用队列(一种可能性)允许线程快速“切换”任务到其他线程,争用最少(即,在处理数据的过程中不使用CS, CS仅持续足够长的时间将数据结构放入队列,而其他一些线程则从那里开始处理。
答案 1 :(得分:0)
你不能说“我在线程A中使用临界区而在线程B中没有”。 Critical部分是访问共享资源的一段代码。当从两个并行运行的线程执行此代码时,共享资源可能会被破坏,因此您需要同步对它的访问:您需要使用一些同步对象(互斥对象,信号量,事件......取决于平台和您正在使用的API)。 ThreadA锁定关键部分,因此ThreadB需要等到ThreadA释放它。
如果希望主线程阻塞(等待)少于工作线程,请将工作线程优先级设置为低于主线程的优先级。