C++ 在主线程中处理多个线程

Gar*_*eld 5 c++ multithreading visual-studio-2005

我对多线程有点陌生,所以如果这些问题太微不足道,请原谅我。

我的应用程序需要在一个线程中创建多个线程并从每个线程执行操作。

例如,我有一组文件要读取,比如说 50 个,我使用 CreateThread() 函数创建一个线程来读取这些文件。

现在这个主线程创建了 4 个线程来访问该文件。第一个线程指定文件 1,第二个线程指定文件 2,依此类推。

第一个线程完成读取文件 1 并向主线程提供所需数据后,主线程需要使用文件 5 调用它并从中获取数据。所有其他线程也类似,直到读取完所有 50 个文件。

之后,每个线程都被销毁,最后我的主线程被销毁。

我面临的问题是:

1)如何让线程读取文件后停止退出?

2)如何用其他文件名再次调用线程?

3)我的子线程如何向主线程提供信息?

4)当一个线程完成读取文件并向主线程返回数据后,主线程如何知道哪个线程提供了数据?

谢谢

Phi*_*ipp 4

这是多线程编程中非常常见的问题。您可以将其视为生产者-消费者问题:主线程“生产”由工作线程“消耗”的任务(seg http://www.mario-konrad.ch/blog/programming/multithread/tutorial-06 .html)。您可能还想阅读有关“线程池”的内容。

我强烈建议阅读boost的同步(http://www.boost.org/doc/libs/1_50_0/doc/html/thread.html)并使用boost的线程功能,因为它是平台独立的并且很好用。

更具体地说,您应该创建一个包含要完成的操作的队列(通常它是所有工作线程的同一个队列。如果您确实想确保线程 1 正在执行任务 1、5、9 ...您可能会希望每个工作线程有一个队列)。对该队列的访问必须通过 a 同步,当新数据添加到互斥体时mutex可以通知等待线程。condition_variables

1.) 不要退出线程函数,而是等待条件被触发,然后使用循环重新while ([exit condition not true])启动

2.) 参见 1。

3.) 通过任何既可以访问又受 a 保护的变量mutex(例如结果队列)

4.) 通过添加此信息作为结果写入结果队列。

另一个建议:正确地获得多线程总是很困难。因此,请尽可能小心并编写测试来检测死锁和竞争条件。