我正在使用Hazard指针来实现C中的无锁链接列表.除了各种基本队列和堆栈之外,我找不到任何示例代码.问题是我需要遍历列表,所以我的问题是我是否可以在分配后更改危险指针的值.例如:
t?Top
while(true) {
if t=null then
return null
*hp?t
if Top!=t then
continue
...
t?(t?next) //after this instruction pointer t will be still protected?
}
Run Code Online (Sandbox Code Playgroud) 我正在尝试使用OpenMP中的任务实现并行算法.并行编程模式基于生产者 - 消费者的想法,但由于消费者流程比生产者慢,我想使用一些生产者和几个消费者.主要思想是创建与生产者一样多的OS线程,然后每个线程创建要并行完成的任务(由消费者完成).每个生产者都将与相应数量的消费者(即numCheckers/numSeekers)相关联.我在英特尔双芯片服务器上运行该算法,每个芯片有6个内核.问题在于,当我只使用一个生产者(寻求者)和越来越多的消费者(检查员)时,随着消费者数量的增长,性能衰退得很快(见下表),即使正确的核心数量在100%.另一方面,如果我增加生产者的数量,平均时间减少或至少保持稳定,即使消费者数量成比例.在我看来,所有的改进都是通过生产者之间的输入划分来实现的,而且任务只是烦恼.但同样,我对一个生产者的行为没有任何解释.我在OpenMP-Task逻辑中遗漏了什么?难道我做错了什么?
-------------------------------------------------------------------------
| producers | consumers | time |
-------------------------------------------------------------------------
| 1 | 1 | 0.642935 |
| 1 | 2 | 3.004023 |
| 1 | 3 | 5.332524 |
| 1 | 4 | 7.222009 |
| 1 | 5 | 9.472093 |
| 1 | 6 | 10.372389 |
| 1 | 7 | 12.671839 |
| 1 | 8 | 14.631013 |
| 1 | 9 | 14.500603 |
| 1 | 10 | …Run Code Online (Sandbox Code Playgroud) 我有一个C代码,我正在运行一些测试.我需要访问一个数组,但是在"只读"模式下.我正在做这样的事情:
for (int i= 0; i < 1000; i++){
int a = shared_array[rand() % 64];
int b = shared_array[rand() % 64];
}
Run Code Online (Sandbox Code Playgroud)
我的问题是:如何从内存中获取值并确保编译器没有通过删除这些指令来优化它,因为在我的测试中我对这些值没有任何作用.即使我添加了一个操作int v = a + b,也不会在其他任何地方使用v,因此可以忽略它.
我正在使用gcc和-O3,我需要这样做才能将它与来自其他来源的结果进行比较.