C++中的队列和线程

aiazj4mn  于 2023-04-13  发布在  其他
关注(0)|答案(1)|浏览(133)

我想做的是:

我试图使程序巫婆的目标是添加元素到队列(在线程)和显示有关队列的数据(你可以看到数据显示在主).在此之前,我想删除一个元素形式队列(每两秒)和添加新元素(每一秒).

代码

#include <iostream>
#include <queue>
#include <thread>
#include <Windows.h>

using std::queue;
using std::cout;

void loadQueue(queue<int> &toLoad)
{
    for(int i = 0; i < 100; i++)
    {
        toLoad.push(i); 
        Sleep(1000);
    }
}

int main(void)
{
    queue<int>toLoad;
    std::thread(loadQueue, std::ref(toLoad));

    while(true)
    {
        cout << "SIZE OF QUEUE : " << toLoad.size() << '\n' << '\n'; 

        cout <<"FRONT :" << toLoad.front() << '\n' << '\n';

        cout <<"BACK : " << toLoad.back() << '\n';
        toLoad.pop();
        Sleep(2000);
    }

}

关于错误

当我启动程序时,我看不到任何东西。程序立即关闭。Visual Studio向我显示以下消息:

cvxl0en2

cvxl0en21#

std::thread在附加到执行线程时不能被销毁。然而,在您的情况下,您在这行代码中引入了一个临时变量,它在表达式完成时被销毁:

std::thread(loadQueue, std::ref(toLoad));

您需要分离线程并让它:

std::thread{ loadQueue, std::ref(toLoad) }.detach();

或命名变量并在工作进行时保持其活动:

std::thread thread{ loadQueue, std::ref(toLoad) };

由于你在主线程中有无限循环,这个线程永远不会被销毁,但理想情况下你想在某个地方加入它,例如在main函数的末尾:

while(true)
{
   ... 
}
thread.join();

另外要注意的是,std::queue不是线程安全的类,所以你必须手动同步对它的访问,否则你的代码中会有竞争条件,这是标准的UB。

相关问题