小编ees*_*_cu的帖子

遍历带有危险指针的列表

我正在使用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)

c linked-list thread-safety

7
推荐指数
1
解决办法
709
查看次数

使用OpenMP-Tasks的生产者 - 消费者

我正在尝试使用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 multithreading task openmp

5
推荐指数
1
解决办法
5309
查看次数

gcc中的编译器优化

我有一个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,我需要这样做才能将它与来自其他来源的结果进行比较.

c compiler-construction optimization

3
推荐指数
1
解决办法
108
查看次数