该列表不是通过printList()打印的,我在这里做错了什么?

时间:2018-07-27 17:41:14

标签: c++11 stl

请参阅下面的代码。

 #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在插入列表中的任何项目之前先执行?这是什么原因呢?

2 个答案:

答案 0 :(得分:0)

如果您像这样旋转线程,则不能保证它们中的哪个将首先执行或完成。

答案 1 :(得分:0)

您正在执行3个具有不同任务要做的线程:

  • 前2个线程执行功能 addToList ,该函数具有 n 次的作用。
  • 第三个线程正在执行功能 printList

在这种情况下, 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 不会同时开始,我出于实际目的将其表示。