相关疑难解决方法(0)

Spinlock与Semaphore

信号量和自旋锁之间的基本区别是什么?

什么时候我们会使用信号量而不是自旋锁?

c c++ unix linux operating-system

112
推荐指数
7
解决办法
7万
查看次数

锁定声明有多贵?

我一直在尝试多线程和并行处理,我需要一个计数器来对处理速度进行一些基本的计数和统计分析.为了避免同时使用我的类的问题,我在我的类中的私有变量上使用了一个lock语句:

private object mutex = new object();

public void Count(int amount)
{
 lock(mutex)
 {
  done += amount;
 }
}
Run Code Online (Sandbox Code Playgroud)

但我想知道......锁定变量有多贵?对性能有负面影响?

.net c# parallel-processing multithreading locking

101
推荐指数
7
解决办法
4万
查看次数

通知另一个线程数据可用的最快方法是什么?任何纺纱的替代品?

我的一个线程将数据写入循环缓冲区,另一个线程需要尽快处理此数据.我想写这么简单spin.伪代码!

    while (true) {
        while (!a[i]) {
            /* do nothing - just keep checking over and over */
        }
        // process b[i]
        i++;
        if (i >= MAX_LENGTH) {
            i = 0;
        }
    }
Run Code Online (Sandbox Code Playgroud)

上面我a用来表示存储的数据b可供处理.Probaly我也应该为这种"热"过程设置线程.当然这种旋转在CPU方面非常昂贵,但对我来说这是好的,因为我的主要要求是延迟.

问题是 - 我应该写出类似的东西,boost或者stl允许以下内容:

  1. 更容易使用.
  2. 在占用较少CPU资源的同时,延迟大致相同(甚至更好)?

我认为我的模式非常普遍,某些地方应该有一些好的实现.

upd似乎我的问题仍然太复杂了.让我们考虑一下这种情况,当我需要以任意顺序将一些项目写入数组时,另一个线程应该在项目可用时以正确的顺序读取它们,如何做到这一点?

UPD2

我正在添加测试程序来演示我想要实现的内容和方式.至少在我的机器上它恰好起作用.我rand用来告诉你我不能使用一般queue,我需要使用array-based结构:

#include "stdafx.h"
#include <string>
#include <boost/thread.hpp>
#include "windows.h" // for Sleep


const int BUFFER_LENGTH = 10; …
Run Code Online (Sandbox Code Playgroud)

c++ multithreading

8
推荐指数
1
解决办法
6342
查看次数

信号量实施

我想知道是否有办法在C++(或C#)中实现信号量,任何有帮助的库.我尝试使用OpenMP但我无法实际阻止线程,而是我不得不忙着等待它们,如果/当我没有足够数量的线程时会导致死锁.首先,我正在寻找一个可以让我阻止/生成/杀死我的线程的库.
其次,有没有已经实现信号量的库?
最后,当我被介绍到信号量的上下文时,我发现它非常有用(也许我错了?)但我没有看到很多库(如果有的话)实现它.我熟悉OpenMP,环顾英特尔的TBB,C#线程.但是在这些中我都没有明确地看到信号量.那些信号量不像我想的那么实用吗?还是他们难以实施?还是我不知道?
PS
信号量可以跨平台实现吗?因为它们可能与操作系统有关.

c# c++ implementation semaphore

2
推荐指数
1
解决办法
3629
查看次数