gpt4 book ai didi

c++ - 行动手册中 C++ 并发的测试线程安全堆栈示例的生产者和消费者函数

转载 作者:太空宇宙 更新时间:2023-11-04 11:24:20 27 4
gpt4 key购买 nike

我已经开始学习并发 (C++11),阅读《C++ 并发实战》一书。如何测试线程安全的堆栈类(示例取自 Action list 3.5 中的 C++ 并发)。我想要生产者/消费者功能的不同实现,让我测试它的所有功能。

#include <exception>
#include <memory>
#include <mutex>
#include <stack>

struct empty_stack: std::exception
{
const char* what() const throw();
};

template<typename T>
class threadsafe_stack
{
private:
std::stack<T> data;
mutable std::mutex m;
public:
threadsafe_stack() {}
threadsafe_stack(const threadsafe_stack& other)
{
std::lock_guard<std::mutex> lock(other.m);
data=other.data;
}
threadsafe_stack& operator = (const threadsafe_stack&) = delete;

void push(T new_value)
{
std::lock_guard<std::mutex> lock(m);
data.push(new_value);

}

std::shared_ptr<T> pop()
{
std::lock_guard<std::mutex> lock(m);
if(data.empty()) throw empty_stack();
std::shared_ptr<T> const res(std::make_shared<T>(data.top()));
data.pop();
return res;
}

void pop(T& value)
{
std::lock_guard<std::mutex> lock(m);
if (data.empty()) throw empty_stack();
value = data.top();
data.pop();
}

bool empty() const
{
std::lock_guard<std::mutex> lock(m);
return data.empty();
}
};

int main()
{

//test class

return 0;
}

最佳答案

您只需要:

  • 从您的主函数创建一个堆栈
  • 启动一个将填充堆栈的线程(将堆栈对象指针作为参数传递给线程,并使线程执行一个for循环,通过一直调用push来填充堆栈)
  • 然后,当该线程运行时,从主程序的另一个循环中清空堆栈

如果您只是想进行快速测试并且不知道如何在创建时将对象传递给线程,您也可以将堆栈声明为全局变量。

如果你需要干净退出,添加一个atomic(编辑,我首先推荐volatile)bool传递给线程告诉它你已经完成并要求它停止它的循环。然后使用join等待线程退出。

关于c++ - 行动手册中 C++ 并发的测试线程安全堆栈示例的生产者和消费者函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27206304/

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