gpt4 book ai didi

c++ - condition_variable::wait_for 方法不返回 - 即使在超时之后

转载 作者:行者123 更新时间:2023-11-30 03:47:00 25 4
gpt4 key购买 nike

我有C#编码经验;我开始学习 C++ 并使用 boost 库进行线程处理。我编写了以下类 - 试图将成员函数作为线程执行。编写以下简单代码,我希望线程函数内的 while 循环每秒执行一次。

#include <boost/chrono/chrono.hpp>
#include <boost/thread/thread.hpp>
#include <iostream>

using namespace boost;

class MyClassWithThread : public boost::enable_shared_from_this<MyClassWithThread>
{
mutex muThreadControl;
condition_variable cvThreadControl;
bool threadToBeStopped = false;

void ThreadFunction()
{
std::cout << "Beginning the Thread" << std::endl;

while(true)
{
bool endIOThread = false;
std::cout << "\nChecking if Thread to be stopped: ";
{
boost::mutex::scoped_lock lock(muThreadControl);
endIOThread = cvThreadControl.wait_for(lock,
boost::chrono::seconds(1),
[this]{return threadToBeStopped;} ) == cv_status::no_timeout;
std::cout << endIOThread << std::endl
}
}
std::cout << "Exiting the Thread" << std::endl;
}

public:
thread threadRunner;
MyClassWithThread()
{
threadRunner = thread(&MyClassWithThread::ThreadFunction, this);
}
};


int main(int argc, char* argv[])
{
MyClassWithThread myclassWithThread;
myclassWithThread.threadRunner.join();
return 0;
}

在 Linux 上构建:

g++ -std=c++11 -pthread cond-wait-test.cpp -o cond-wait-test -lboost_system -lboost_thread -lboost_chrono

但是,当我执行代码时,我只注意到线程执行在调用 wait_for 方法时被阻塞;永远。尽管有超时时间。此外,系统的资源监视器显示处理器内核已被 100% 使用。

谁能解释一下代码中发生了什么?

最佳答案

正如@Zan Lynx 所建议的,罪魁祸首是#pragma pack 语句。我最初只使用#pragma pack(1) 来字节对齐一些结构。这影响了许多互斥结构以 1 字节对齐。

我将#pragma pack(1) 语句更改为#pragma pack(push, 1) #pragma pack(pop)。一切正常。因此我的问题解决了;我学到了一些东西。多谢。 ! :-)

关于c++ - condition_variable::wait_for 方法不返回 - 即使在超时之后,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33877084/

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