![]() |
1
2
首先,假设
这仍然不能解决
你想用安全哨兵代替
这是否仍算作“无等待”取决于您能否在中间状态下找到有用的操作。
有很多论文要阅读,比使用哨兵更有效-实际上,你是在用一个CAS模拟一个两个单词的CAS,因为你需要检查
未以任何方式测试:
由于一次只能在一个线程中检查或变异结果的指针,因此应该是安全的(我以前没有使用过这种确切的模式,通常在设计一些东西的几天后,我会想到一些奇怪的情况)。这是否比用pthread_mutex_trylock包装std::deque更好,值得衡量。 当然,不管是这个还是原始线程都不是非阻塞的——如果一个线程一直从堆栈中拉出,那么任何其他线程都将无限期地循环,等待CAS成功。不太可能,如果CAS确实失败,则通过返回false很容易删除,但是如果线程不应该等待,则必须确定希望线程做什么。如果在某个东西可以退出队列之前旋转是可以的,则不需要返回代码。 我主要在x86/x64上工作,那里没有无锁代码,因为CMPXCHG隐式地锁定总线,并且需要与要同步的缓存数成比例的时间。所以你可以有不旋转和等待的代码,但你不能有不锁定的代码。 |
![]() |
2
1
不如稍微改变一下,这样就可以抓住堆栈顶部的内容,如果发现堆栈顶部是空的,则引发异常。 |
![]() |
3
0
正确的关注。
此外,您还忘记了内存重新排序和缓存的可能性。例如,您的线程可能仍然看到
|
![]() |
5
0
我不明白这怎么可能。我看到的一个问题是当你取消引用
|
![]() |
rookie · 检查函数模板的所有参数包参数是否属于int 1 年前 |
![]() |
ivaigult · -W转换和隐式字符串到布尔类型转换 1 年前 |
![]() |
rainer · 后台插入程序的初始化 1 年前 |
![]() |
Community wiki · 以理智、安全和高效的方式复制文件 1 年前 |
|
Shefali Kanaujia · 对C中向量的向量进行排序++ 1 年前 |
|
Ma Joonyoung · 粗粒度和细粒度链表的时间比较 1 年前 |