- 论坛徽章:
- 9
|
本帖最后由 wlmqgzm 于 2017-04-18 18:43 编辑
回复 68# zylthinking
1)标准版的wait_free_queue确实不依靠 CAS spin 工作, 代码如下:
- #include <cstddef>
- #include <atomic>
- template <typename T, int capacity> class spsc_queue {
- public:
- spsc_queue(const T &val) : head(0), tail(0), invalid_val(val) {
- for (int i = 0; i < capacity; i++) {
- buf = invalid_val;
- }
- }
- spsc_queue(const spsc_queue &) = delete;
- spsc_queue &operator=(const spsc_queue &) = delete;
- bool enqueue(const T &data) {
- if (buf[tail].load(std::memory_order_acquire) == invalid_val) {
- buf[tail].store(data, std::memory_order_release);
- tail = (tail + 1) % capacity;
- return true;
- }
- return false;
- }
- bool dequeue(T &data) {
- if (buf[head].load(std::memory_order_acquire) != invalid_val) {
- data = buf[head].load(std::memory_order_relaxed);
- buf[head].store(invalid_val, std::memory_order_release);
- head = (head + 1) % capacity;
- return true;
- }
- return false;
- }
- private:
- static constexpr size_t CACHELINE = 64;
- alignas(CACHELINE) unsigned int head;
- alignas(CACHELINE) unsigned int tail;
- char padding[CACHELINE - sizeof(tail)];
- std::atomic<T> buf[capacity];
- T invalid_val;
- };
2. 你知道 gcc builtin 系列函数本身自带了内存屏障效果吗, 你知道 std::memeory_order 不等于机器指令吗, 你知道相同的指令会以你不知道的面目出现吗?
标准版的wait_free主要是靠内存一致性来实现无锁的, 所以必须要靠 std::memeory_order 来保证正确性。具体读代码吧。
3. 你知道我用的机器不是你用的机器吗, 你知道看性能对比是看相同外部条件下的表现吗? 你知道你那句话拿到任何地方都会被笑话的吗
近40倍的性能差距,你究竟用的是什么机器啊,我当年测试用的是 intel G3258@3.2G 双核CPU, 你的机器比这个还烂40倍??? |
|