如何解决调用线程内的函数
我正在使用 gtest 和 lcov 进行单元测试并查找代码覆盖率。 我的功能是
void MyClass::MyFunction(const std::string& argument1,const std::string& argument2) {
std::thread([this,argument1,argument2]() {
std::unique_lock<std::mutex> live_lock_(live_mutex_);
int64_t time_stamp = std::chrono::duration_cast<std::chrono::milliseconds>(std::chrono::system_clock::now().time_since_epoch()).count();
int64_t time_to_live = myList[argument1] - (time_stamp % myList[argument1]);
cond_var_.wait_for(time_to_live_lock_,std::chrono::milliseconds(time_to_live),[this,argument1] { return cond_var_status_[argument1]; });
if (message_master_.find(argument1) != message_master_.end()) {
//something
}
}).detach();
std::cout<< "end line is executed"<<std::endl; }
我的测试函数是
TEST(test,test1) {
Myclass testObj;
testObj.MyFunction("arg1","arg2");
ASSERT_EQ("","");
};
当我运行测试时,除了线程内部的代码之外的所有代码都被执行。 那么有没有办法在线程内部调用这些代码呢?
解决方法
你怎么知道这些行都没有被执行? 我建议制作一个测试程序,使用 -g 和 -Wall 进行编译,然后使用 gdb 来确保实际创建了一个线程。如果是,请逐步执行代码。 可能是编译器删除了它认为什么都不做的代码。
,这就是我要测试它的方式(我稍微修改了代码,但原则上它是一样的。所有全局变量最有可能移动到 MyClass
):
#include <atomic>
#include <condition_variable>
#include <map>
#include <mutex>
#include <thread>
std::mutex time_to_live_mutex_;
std::map<std::string,int64_t> myList;
std::map<std::string,bool> cond_var_status_;
std::map<std::string,std::string> incoming_message_master_;
std::condition_variable cond_var_;
std::atomic_bool something_happened{false};
void foo(const std::string& argument1,const std::string& argument2) {
std::thread([argument1,argument2]() {
std::unique_lock<std::mutex> time_to_live_lock_(time_to_live_mutex_);
int64_t time_stamp = std::chrono::duration_cast<std::chrono::milliseconds>(std::chrono::system_clock::now().time_since_epoch()).count();
int64_t time_to_live = myList[argument1] - (time_stamp % myList[argument1]);
cond_var_.wait_for(time_to_live_lock_,std::chrono::milliseconds(time_to_live),[argument1] { return cond_var_status_[argument1]; });
if (incoming_message_master_.find(argument1) != incoming_message_master_.end()) {
//something
something_happened = true;
}
}).detach();
}
TEST(TestFoo,testing_foo_thread) {
int64_t timeout = 10000;
myList["bar"] = timeout; // so that cond variable waits long time
cond_var_status_["bar"] = false; // so that cond variable returns false at first try
incoming_message_master_["bar"] = std::string("42"); // so that something can happen
foo("bar","fiz");
ASSERT_FALSE(something_happened); // cond variable is still waiting at this point
{
std::unique_lock<std::mutex> time_to_live_lock_(time_to_live_mutex_);
cond_var_status_["bar"] = true; // so that cond variable returns eventually
}
while(!something_happened && timeout > 0) {
std::this_thread::sleep_for(std::chrono::milliseconds(10));
timeout -= 10;
}
ASSERT_TRUE(something_happened); // cond variable is not waiting,should have returned
}
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。