ZBLOG

std::atomic m_lock;//队列正在析构

std::atomic<bool> 是 C++11 标准库中的一个原子类型,通常用于多线程编程中以确保数据的安全访问。具体来说,它能够在多个线程之间共享和修改布尔值而不会出现竞态条件。这里你提到的 m_lock 可能用于表示某个队列是否正在析构。

以下是一个简单的例子,展示如何使用 std::atomic<bool> 来控制一个队列在析构时的状态,以及如何避免在队列析构期间对其进行访问。

示例:使用 std::atomic<bool> 控制队列析构

  1. #include <iostream>
  2. #include <queue>
  3. #include <thread>
  4. #include <atomic>
  5. #include <chrono>
  6. class ThreadSafeQueue {
  7. public:
  8. ThreadSafeQueue() : m_lock(false) {}
  9. // 添加元素到队列
  10. void enqueue(int value) {
  11. while (m_lock.load()) { // 检查锁状态,若正在析构,则等待
  12. std::this_thread::yield(); // 主动让出 CPU
  13. }
  14. std::lock_guard<std::mutex> guard(m_mutex);
  15. m_queue.push(value);
  16. }
  17. // 从队列中移除元素
  18. bool dequeue(int &result) {
  19. while (m_lock.load()) { // 检查锁状态,若正在析构,则等待
  20. std::this_thread::yield(); // 主动让出 CPU
  21. }
  22. std::lock_guard<std::mutex> guard(m_mutex);
  23. if (m_queue.empty())
  24. return false;
  25. result = m_queue.front();
  26. m_queue.pop();
  27. return true;
  28. }
  29. ~ThreadSafeQueue() {
  30. m_lock.store(true); // 设置锁为 true,指示即将析构
  31. std::lock_guard<std::mutex> guard(m_mutex);
  32. while (!m_queue.empty()) {
  33. m_queue.pop(); // 清空队列中的剩余元素(可选)
  34. }
  35. // 在此可以处理其他资源释放等逻辑
  36. m_lock.store(false); // 可选,在完全结束前解除锁定。
  37. std::cout << "Queue destructed." << std::endl;
  38. }
  39. private:
  40. std::queue<int> m_queue; // 内部存储的队列
  41. mutable std::mutex m_mutex; // 用于保护内部数据结构的互斥量
  42. std::atomic<bool> m_lock; // 指示是否正在析构
  43. };
  44. int main() {
  45. ThreadSafeQueue queue;
  46. queue.enqueue(1);
  47. int value;
  48. if (queue.dequeue(value)) {
  49. std::cout << "Dequeued: " << value << std::endl;
  50. }
  51. return 0;
  52. }

解释

  1. 成员变量

    • std::queue<int> m_queue: 存储实际的数据。
    • std::mutex m_mutex: 用于保护对 m_queue 的访问,以防止多个线程同时访问。
    • std::atomic<bool> m_lock: 一个原子布尔值,用于指示队列是否正在被析构。
  2. enqueue 函数

    • 添加元素之前检查 m_lock 是否为 true。如果是,则表明对象正在被析构,会主动让出 CPU 并等待。
  3. dequeue 函数

    • enqueue 类似,在获取元素之前会检查锁状态,确保安全地从队列中移除元素。
  4. Destructor (~ThreadSafeQueue):

    • 在析构函数中,将 m_lock 设置为 true,以防止其他线程在销毁过程中访问该队列。然后清空队列并完成其他清理操作。

这个实现方式确保了当对象处于拆卸过程时,没有线程能再对其进行操作,从而避免潜在的问题,如使用已删除的内存等。


内容由零声教学AI助手提供,问题来源于学员提问

本站部分文章来源于网络,版权归原作者所有,如有侵权请联系站长删除。
转载请注明出处:https://golang.0voice.com/?id=22661

分享:
扫描分享到社交APP
上一篇
下一篇
发表列表
游客 游客
此处应有掌声~
评论列表

还没有评论,快来说点什么吧~

联系我们

在线咨询: 点击这里给我发消息

微信号:3007537140

上班时间: 10:30-22:30

关注我们
x

注册

已经有帐号?