小编ang*_*lsl的帖子

TSan 种族随着 Alignas 消失(32)

我有一个无锁队列的实现,我相信它是正确的(或者至少是无数据竞争的):

#include <atomic>
#include <iostream>
#include <optional>
#include <thread>

struct Job {
  int id;
  int data;
};

class JobQueue {
  using stdmo = std::memory_order;

  struct Node {
    std::atomic<Node *> next = QUEUE_END;
    Job job;
  };

  static inline Node *const QUEUE_END = nullptr;
  static inline Node *const STACK_END = QUEUE_END + 1;

  struct GenNodePtr {
    Node *node;
    std::uintptr_t gen;
  };

  alignas(64) std::atomic<Node *> jobs_back;
  alignas(64) std::atomic<GenNodePtr> jobs_front;
  alignas(64) std::atomic<GenNodePtr> stack_top;

 public:
  JobQueue()
      : jobs_back{new Node{}},
        jobs_front{GenNodePtr{jobs_back.load(stdmo::relaxed), 1}},
        stack_top{GenNodePtr{STACK_END, 1}} {}

  ~JobQueue() …
Run Code Online (Sandbox Code Playgroud)

c++ lock-free thread-sanitizer

5
推荐指数
0
解决办法
93
查看次数

标签 统计

c++ ×1

lock-free ×1

thread-sanitizer ×1