gpt4 book ai didi

c++ - 一个简单的win32多线程代码。这行得通吗?

转载 作者:太空宇宙 更新时间:2023-11-04 06:45:42 26 4
gpt4 key购买 nike

我想实现一个应用程序,它有一个线程遍历磁盘中的所有文件,同时另一个线程检查条件。

当满足条件时,遍历文件的线程退出

我有一个像这样的MONITOR THREAD

while(true){

//--------CHECK CONDITION---------

if(MEETS_CONDITION){
//PostThreadMessage WM_QUIT to the SCANNING THREAD

break;
}
Sleep(1000);
}

我有一个像这样的扫描线程

while(true){

//-------do scanning files------------

//PeekMessage and check if it's WM_QUIT
//if it is, then BREAK.

Sleep(10000);
}

这两个线程都是由MAIN THREAD创建的。

这个方法可以吗?

欢迎提出任何建议。

编辑:

监控线程正在扫描与扫描线程无关的文件。事实上,在我的程序中,监控线程正在打开一个指定的注册表项并检查该键指向的文件是否存在。在扫描线程中,它遍历整个磁盘以收集与其他内容匹配的文件。因此,这两个线程分开进行,文件的缓冲/取消缓冲不会分离到两个线程中。

作用是,扫描线程通过磁盘收集文件,一旦某个Regkey指向的特定文件被删除,扫描线程在扫描结束后立即停止。我循环此扫描过程,因为我希望之后新创建的文件也可以包含在扫描中。

最佳答案

事实上,将检查委托(delegate)给监控线程并不会像您想象的那样节省您的时间,甚至会表现得更差。

确实,检查会减慢扫描循环,但将缓慢的处理委托(delegate)给监控线程并不能解决问题。
监控线程无法检查尚未扫描的文件,并且由于它比扫描线程慢,即使在扫描过程中达到了所需的文件,您也会继续扫描不需要的文件,直到(慢的)监控线程完成终于也到达了想要的文件。因此,您将一无所获,更糟糕的是,您将进行一些额外的不必要扫描。

更糟糕的是(再次),要将检查委托(delegate)给监控线程,您需要缓冲扫描的文件,以便监控线程能够检索它们并为每个文件执行检查。因此,您将添加一些缓冲/非缓冲任务(无需讨论避免并发访问缓冲区和竞争条件所需的互斥机制)。

我觉得还是去掉监听线程,一切都在扫描线程里做比较好。
它可能如下所示:

void scanning_thread(const std::string & filename)
{
bool found(false);
bool finished(false);
std::string current;

do
{
current = find_next(); // For the example, I assumed this function exists
if(current == filename) // filename found
found = true;
else if(current.empty()) // end of search
finished = true;
}
while(!found && !finished);

// Do something you want
}

关于c++ - 一个简单的win32多线程代码。这行得通吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58268156/

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