请参阅下面的代码。
#include <iostream>
#include <thread>
#include <list>
#include <algorithm>
using namespace std;
// a global variable
std::list<int>myList;
void addToList(int max, int interval)
{
for (int i = 0; i < max; i++) {
if( (i % interval) == 0) myList.push_back(i);
}
}
void printList()
{
for (std::list<int>::iterator itr = myList.begin(), end_itr = myList.end(); itr != end_itr; ++itr )
{
cout << *itr << ",";
}
}
int main()
{
int max = 100;
std::thread t1(addToList, max, 1);
std::thread t2(addToList, max, 10);
std::thread t3(printList);
t1.join();
t2.join();
t3.join();
return 0;
}
线程t3(printList)没有打印列表。空输出即将到来。是因为t3在插入列表中的任何项目之前先执行?这是什么原因呢?
答案 0 :(得分:0)
如果您像这样旋转线程,则不能保证它们中的哪个将首先执行或完成。
答案 1 :(得分:0)
您正在执行3个具有不同任务要做的线程:
在这种情况下, printList 不等待 t1 和 t2 完成。目前正在读取列表( t3 *)** t1 和 t2 尚未添加任何内容。
t1
|-- loop[0 max]{ / calculate interval / adding number at the end of list} -->[End of t1]
t2
|-- loop[0 max]{ / calculate interval / adding number at the end of list} -->[End of t2]
t3
|-- Rd & Prnt -->[End of t3]
^ ^
| |
t3 finished before t1 and t2 Possible end of the threads t1 and t2 (*)
为避免这种情况, t3 必须等到 t1 和 t2 完成。
int main()
{
int max = 100;
std::thread t1(addToList, max, 1);
std::thread t2(addToList, max, 10);
t1.join();
t2.join();
std::thread t3(printList);
t3.join();
return 0;
}
t1
|-- loop[0 max]{ / calculate interval / adding number at the end of list} -->[End of t1]
t2
|-- loop[0 max]{ / calculate interval / adding number at the end of list} -->[End of t2]
t3
|-- Rd & Prnt -->[End of t3]
考虑到 t1 和 t2 不会同时开始,我出于实际目的将其表示。