【发布时间】:2012-12-02 08:49:29
【问题描述】:
我有多个线程在后台处理多个文件,而程序处于空闲状态。
为了提高磁盘吞吐量,我使用临界区来确保不会有两个线程同时使用同一个磁盘。
(伪)代码如下所示:
void RunThread(HANDLE fileHandle)
{
// Acquire CRITICAL_SECTION for disk
CritSecLock diskLock(GetDiskLock(fileHandle));
for (...)
{
// Do some processing on file
}
}
一旦用户请求处理文件,我需要停止所有线程 -- 除了正在处理请求文件的线程。处理完文件后,我想再次恢复所有线程。
鉴于SuspendThread 是个坏主意,我该如何停止除处理相关输入的线程之外的所有线程?
我需要什么样的线程对象/功能——互斥体、信号量、事件或其他?我将如何使用它们? (我希望与 Windows XP 兼容。)
【问题讨论】:
-
我认为条件变量是最好的方法。
-
听起来您不仅需要暂停线程。您要运行的线程可能没有它需要的磁盘锁。您需要正在“暂停”的线程来释放磁盘锁,以便处理请求的文件的线程可以获得所需的磁盘锁。没有内置机制可以做到这一点,您需要线程本身在其工作时偶尔检查某些条件。一种方法是让每个线程处理一个文件块,释放磁盘锁,等到它有权继续(可能在条件变量上)然后重新获得磁盘锁。
-
@SteveJessop:是的,完全正确!这是问题的另一部分...我需要以某种方式执行
if (ThisThreadNeedsToSuspend()) { ReleaseDiskLock(); WaitForResumeNotice(); ReacquireDiskLock(); }之类的操作,但我不确定实现它的正确方法是什么,而不会导致ThisThreadNeedsToSuspend和WaitForResumeNotice之间的竞争条件。 -
@Mehrdad:好的,如果这是你需要的,我会发布答案:-)
-
@SteveJessop:很酷,谢谢! :)
标签: c++ c multithreading winapi atl