相关疑难解决方法(0)

读者/作者用C++锁定

我正在寻找一个很好的C++读写器锁.我们有一个不常见的作家和许多常见读者的用例,并希望为此进行优化.我更喜欢跨平台的解决方案,但只有Windows可以接受.

c++ multithreading locking

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

boost :: unique_lock vs boost :: lock_guard

我不太清楚这两个锁类之间的区别.据说在boost文档中,boost::unique_lock没有实现自动锁定.

这是否意味着之间的主要区别unique_lock,并lock_guard是用unique_lock我们必须显式调用lock()功能?

c++ boost locking

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

线程安全执行循环缓冲区

boost库中的Circular_buffer不是线程安全的.所以我将boost :: circular_buffer对象包装在一个类中,如下所示.通过使用条件变量,互斥锁和锁获取/释放,实现了线程之间的相互排斥(我认为).这个实现线程安全吗?

#include <boost/thread/condition.hpp>
#include <boost/thread/mutex.hpp>
#include <boost/thread/thread.hpp>
#include <boost/circular_buffer.hpp>

// Thread safe circular buffer 
template <typename T>
class circ_buffer : private boost::noncopyable
{
public:
    typedef boost::mutex::scoped_lock lock;
    circ_buffer() {}
    circ_buffer(int n) {cb.set_capacity(n);}
    void send (T imdata) {
        lock lk(monitor);
        cb.push_back(imdata);
        buffer_not_empty.notify_one();
    }
    T receive() {
        lock lk(monitor);
        while (cb.empty())
            buffer_not_empty.wait(lk);
        T imdata = cb.front();
        cb.pop_front();
        return imdata;
    }
    void clear() {
        lock lk(monitor);
        cb.clear();
    }
    int size() {
        lock lk(monitor);
        return cb.size();
    }
    void set_capacity(int capacity) {
        lock …
Run Code Online (Sandbox Code Playgroud)

c++ multithreading boost opencv

32
推荐指数
2
解决办法
3万
查看次数

可以将std :: shared_timed_mutex上的共享锁升级为独占锁吗?

新的std :: shared_timed_mutex允许两种类型的锁:共享和独占.

如果有人持有共享锁,有没有办法以原子方式将它("升级它")交换为独占锁?换句话说,给定以下代码,我如何避免非原子性下降并重新锁定?

std::shared_timed_mutex m; //Guards a std::vector.
m.lock_shared();

//Read from vector. (Shared lock is sufficient.)
// ...

//Now we want to write to the vector. We need an exclusive lock.
m.unlock_shared();
                   //     <---- Problem here: non-atomic! 
m.lock(); 

//Write to vector.
// ...

m.unlock();
Run Code Online (Sandbox Code Playgroud)

理想情况下,m.unlock_shared(); m.lock();可以用类似m.upgrade_to_exclusive();(或类似的东西boost::.upgrade_to_unique_lock())替换.

在一个类似的问题,但对于Boost的shared_mutex Dave S提及

在不释放共享锁的情况下,无法从共享锁转换为唯一锁,或共享锁转换为可升级锁.

我不确定这是否适用于std :: shared_mutex,尽管我怀疑它确实如此.

基于std :: atomic/condition_variable或GCC的事务内存,我会对合理的解决方法感到满意.

编辑:霍华德的回答解决了我的问题.他的提议N3427包含了实现互斥升级的机制的很好的描述.我仍然欢迎基于std :: atomic/condition_variable或GCC事务内存的解决方法.

c++ multithreading c++11 c++14

16
推荐指数
1
解决办法
3593
查看次数

提升shared_lock.阅读首选?

我正在查看用于读取器/写入器锁的boost库(版本1.45).当我对它进行测试时,似乎shared_ptr更喜欢我的读取器线程,即当我的编写器试图锁定它的操作时,它并没有阻止任何后续读取发生.

是否有可能在提升中改变这种行为?

using namespace std;
using namespace boost;

mutex outLock;
shared_mutex workerAccess;
bool shouldIWork = true;

class WorkerKiller
{
public:   

    void operator()()  
    {
        upgrade_lock<shared_mutex> lock(workerAccess); 
        upgrade_to_unique_lock<shared_mutex> uniqueLock(lock);

        cout << "Grabbed exclusive lock, killing system" << endl;
        sleep(2);
        shouldIWork = false;
        cout << "KILLING ALL WORK" << endl;  
    }  

private:  
};

class Worker
{  
public:   

    Worker()
    {  
    }  

    void operator()()  
    {
        shared_lock<shared_mutex> lock(workerAccess); 

        if (!shouldIWork) {
            outLock.lock();
            cout << "Workers are on strike.  This worker refuses to work" << endl;
            outLock.unlock(); …
Run Code Online (Sandbox Code Playgroud)

c++ boost

15
推荐指数
1
解决办法
7343
查看次数

Boost中的多个读者,单个写入器锁

我正在尝试在多线程场景中实现以下代码:

Get shared access to mutex
Read data structure
If necessary:
   Get exclusive access to mutex
   Update data structure
   Release exclusive lock
Release shared lock
Run Code Online (Sandbox Code Playgroud)

Boost线程有一个shared_mutex专为多读者单作者模型设计的类.关于这个类,有几个stackoverflow问题.但是,我不确定它适合任何读者可能成为作家的情况.文件说明:

UpgradeLockable概念是SharedLockable概念的改进,允许可升级的所有权以及共享所有权和独占所有权.这是SharedLockable概念提供的多读取器/单写模型的扩展:单个 线程可以在其他人拥有共享所有权的同时具有可升级的所有权.

从单词"single"我怀疑只有一个线程可以持有可升级的锁.其他人只持有共享锁,无法升级到独占锁.

你知道boost::shared_lock在这种情况下是否有用(任何读者都可能成为作家),或者是否还有其他方法可以实现这一目标?

c++ multithreading boost mutex

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

C++映射的线程同步

我正在使用pthread(c ++ 98标准)创建一个多线程的c ++程序.

我有一个多线程将访问的std :: map.访问将使用find添加和删除元素,并使用[]运算符访问元素.

我知道使用[]运算符进行读取,甚至使用它修改元素是线程安全的,但其余操作则不是.

第一个问题:我能正确理解吗?

有些线程只能通过[]访问元素,而其他线程则会执行其他一些操作.显然我需要某种形式的线程同步.

我认为这应该工作的方式是: - 虽然没有对地图进行"写入"操作,但线程应该能够同时"读取"它. - 当一个线程想要"写"到映射时,它应该设置一个锁,这样没有线程启动任何"读"或"写"操作,然后它应该等到所有"读"操作都完成,此时它将执行操作并释放锁. - 释放锁后,所有线程都应该能够自由读取.

主要问题是:我可以使用哪些线程同步方法来实现此行为?

我已经读过有关互斥,条件变量和信号量的内容,据我所知,他们不会做我需要的东西.我熟悉互斥,但不熟悉cond.变量或信号量.

我看到的主要问题是我需要一种锁定线程的方法,直到某些事情发生(写操作结束),然后这些线程依次锁定任何东西.此外,我需要类似倒置信号量的东西,当计数器大于1时阻塞,然后当它为0时唤醒(即没有进行读取操作).

提前致谢.

PS这是我的第一篇文章.请指出我做错了什么!

c++ multithreading dictionary pthreads

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

使用Boost进行进程间读写器锁定

在解释如何使用Boost实现读/写锁时,这个线程是金牌.它似乎相对简单,我真的很喜欢它,但它似乎也使用一个非命名的锁,我需要一个进程间解决方案(不需要是可移植的,可以只有Windows).

有没有办法进行进程间shared_mutex?我看到有一个,named_mutex但我不能让它与shared_lock其他锁一起工作.

任何指针都表示赞赏.

[编辑]

与此同时,我遇到了这个几乎击中头部钉子的线程.我有两个问题:

  1. 它没有显示完整的代码(我猜我需要使用,named_upgradable_mutex但我不太确定)和
  2. 我不喜欢修改后的"编写器"的答案,它不使用在析构函数中解锁的现成类,而是使用互斥锁上的3个原始调用序列.

仍然欢迎评论或好的解决方案.

c++ boost boost-interprocess

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

用C++读写互斥

这是一个面试问题.你如何实现读/写互斥?将有多个线程读取和写入资源.我不知道该怎么做.如果需要任何信息,请告诉我.

更新:我不确定我上面的陈述是否有效/可理解.但我真正想知道的是,如何根据互斥锁和其他所需的同步对象在单个对象上实现多次读取和多次写入?

c++ multithreading mutex

6
推荐指数
1
解决办法
9704
查看次数

C++线程安全对象

这似乎是一个非常简单的问题,但在我的所有研究中,我都找不到一个明确的例子......

我正在尝试使用getter和setter函数构建一个可以访问私有变量的自定义类.此类将在全局范围(extern)中实例化一次,并将在我的应用程序中用作数据缓存.它将被许多线程同时使用,99%用于读取,速度非常重要.有没有办法允许并发读取只是锁定写入?(我假设没有)

我是否只是将一个范围的互斥锁作为getter和setter的第一行?或者如何设计这个看似简单的物体的最佳方法?任何例子或链接都将非常感激(我很难绕过它).

我确实编译了Boost,所以它可以使用.

对此,我真的非常感激!

c++ multithreading boost

6
推荐指数
1
解决办法
1172
查看次数