Mar*_*ace 6 c++ multithreading computer-science lock-free lockless
存在三种不同类型的“无锁”算法。并发实践中给出的定义是:
\n\n\n非正式地,“无锁”\xe2\x89\x88“不使用互斥体”==其中任何一个。
\n
我不明白为什么基于锁的算法不能落入上面给出的无锁定义。这是一个简单的基于锁的程序:
\n#include <iostream>\n#include <mutex>\n#include <thread>\n\nstd::mutex x_mut;\n\nvoid print(int& x) {\n std::lock_guard<std::mutex> lk(x_mut);\n std::cout << x;\n}\n\nvoid add(int& x, int y) {\n std::lock_guard<std::mutex> lk(x_mut);\n x += y;\n}\n\nint main() {\n\n int i = 3;\n\n std::thread thread1{print, std::ref(i)};\n\n std::thread thread2(add, std::ref(i), 4);\n\n thread1.join();\n\n thread2.join();\n\n}\nRun Code Online (Sandbox Code Playgroud)\n如果这两个线程都在运行,那么在有限数量的步骤之后,其中一个必须完成。为什么我的程序不满足“无锁”的定义?
\n您对《行动中的并发》的引用是断章取义的。
\n事实上,这本书实际上说的是:
\n\n\n7.1 定义和后果
\n使用互斥体、条件变量和 future 来同步数据的算法和数据结构称为阻塞数据结构和算法。
\n不\xe2\x80\x99 不使用阻塞库\n函数的数据结构和算法被称为非阻塞。并非所有这些数据结构都是无锁的......
\n
然后它进一步将非阻塞算法分解为无阻塞、无锁和无等待。
\n所以无锁算法是
\n所以赫伯·萨特和安东尼·威廉姆斯都是正确的。
\n| 归档时间: |
|
| 查看次数: |
1383 次 |
| 最近记录: |