草庐IT

c++ - 多次读取和一次写入 - 线程安全?

我有一个数据结构,它有两种访问它的方法:query()和modify()。多个线程可以同时使用query(),但只有一个线程可以进入modify(),同时所有使用query()的线程都必须在访问modify()之前退出。在C++中使这个数据结构线程安全的最佳方法是什么?(我阅读了有关提升读/写锁定的内容,但有人告诉我它可能比使用互斥锁慢3-40倍) 最佳答案 一般来说,您应该使用互斥锁来保护共享数据。但如果您共享数据的类型是整数,您也可以考虑使用std::atomic,这通常比锁定互斥锁快得多。

c++ - 共享列表、多个条件、一个或多个条件变量?

假设您有一个列表:classCLIENTS{public:CLIENTS();~CLIENTS();booladdClient();boolremoveClient();boolgetDataFromClientObj(unsignedintid);boolstoreDataInClientObj(unsignedintid);private://vector,thatcontainsalltheclientsboost::ptr_vectorclients;//mutexfortheclient-listboost::mutexmutex;};进一步考虑,getDataFromCli

c++ - boost::thread 应该在无限循环中运行并等待没有互斥量的新输入

我有三个线程,我想一直运行到无限循环。线程对具有状态的对象进行操作,每个线程根据对象的状态执行或休眠。我希望输入线程继续检查state=1的任何新对象并继续处理它,或者等待它。classmyclass{intstate;myclass(){this->state=0;}voidsetState(intx){//setthis->statetox}intgetState(){//returnthis->state}//stuff}voidfoo1(myclass*ob){//stuffwhile(ob->getState()!=0||ob->getState()!=1){//sleepf

c++ - atomic<bool> 与受互斥锁保护的 bool

假设我们有一个内存区域,某个线程正在向其中写入数据。然后它将注意力转移到别处并允许任意其他线程读取数据。然而,在某个时间点,它想要重用该内存区域并再次写入。写入器线程提供了一个bool标志(valid),它表示内存仍然有效,可以从中读取(即他还没有重新使用它)。在某个时候,他会将此标志设置为false,并且再也不会将其设置为true(它只会翻转一次,就是这样)。在顺序一致性的情况下,编写者和读者分别使用这两个代码片段应该是正确的:...valid=false;...和...if(valid){}else{}...我们显然需要做一些事情来确保顺序一致性,即插入必要的获取和释放内存屏障。我

c++ - 如何测试我的阻塞队列实际阻塞

我有一个阻塞队列(我很难改变它的实现),我想测试它是否真的阻塞了。特别是,pop方法必须在队列为空时阻塞,并在执行push时立即解除阻塞。请参阅以下用于测试的伪C++11代码:BlockingQueuequeue;//emptyqueuethreadpushThread([]{sleep(large_delay);queue.push();});queue.pop();显然它并不完美,因为可能会发生整个线程pushThread在pop被调用之前执行完并终止,即使延迟很大,而且延迟越大,我就越需要等待测试结束。我如何正确地确保pop在push被调用之前执行,并且在push返回之前一直阻塞

c++ - 是否有一个 C/C++ 库可以让你找出一组表达式是否互斥?

我正在为我设计的数据流编程语言编写编译器。我非常喜欢它的一个功能是您可以表达以下内容:x3;x这意味着:x3);为了实现这一点,编译器需要知道:((b>3)&&(b((b>3)||(b是否有任何人知道的C/C++库能够验证这2个语句(以及更复杂的语句)?或者是否有任何人可以通过网络获得任何关于类似系统的详细信息的论文?或者有人可以描述一种可能的方法吗?谢谢,丹尼尔 最佳答案 我认为您需要一小组简单的规则来告诉您两个表达式是相等的还是完全不同的。让我们从最简单的开始:b>3和b检查它们是否相等很容易:b>3和b>3相等,b>3和b显然

c++ - SDL 2.0 -> 传递了一个 NULL 互斥体

当我使用SDL2.0编译一个简单示例时,在命令SDL_CreateWindow之后,出现以下错误:“传递了一个NULL互斥量”。我正在使用静态库项目。我也在OSX10.8.3上进行测试。此通知在命令行编译时遗漏了什么?下面是生成程序的命令行和代码示例。编译器:clang++-I"TestSDL/sdl/include"-Wall-c-xc++-archx86_64-std=c++11-stdlib=libc++-MMD-MP-MF"src/main.d"-MT"src/main.d"-o"src/main.o""../src/main.cpp"链接器:clang++-L"TestSDL

c++ - 类似于嵌套互斥体但更通用的东西?

我正在处理一个项目,在对类的成员对象执行某些操作后必须保存一个文件。有时我们希望在一次操作后保存文件,有时我们需要在执行了一批操作之后才保存它。我的想法是使用一个基本上像递归互斥锁一样工作的类。除了不锁定和解锁互斥锁,我希望类在堆栈中类的最后一个实例超出范围时调用一个方法(在本例中为保存文件)。实现一个执行此操作的类不是问题,但这感觉像是我在Boost或STL中找不到的一般问题。这个问题是否有预先存在的标准解决方案,或者我需要推出自己的类(class)来解决这个问题?如果是这样,我的方法是否正确,或者是否有更好的方法来解决问题?下面是我正在寻找的那种行为的简单实现。它只会打印“Hell

c++ - GCC 向依赖默认构造函数的模板化类中的静态数据成员给出 "undefined reference"错误

我遇到了类似的问题:"undefinedreference"tostaticfieldtemplatespecialization但他们使用的解决方法对我不起作用。我有一个带有静态数据成员的CRTP类,其中之一是std::mutex。不幸的是,GCC(4.8.2)的链接器给我这个互斥锁的“undefinedreference”错误。Clang(3.4)没有。有解决方法吗?最初的问题(上面链接)在静态数据成员上调用了复制构造函数,迫使GCC发出一个符号,但是由于我的数据成员是std::mutex,所以这不是一个选项——复制构造函数被删除,并且有没有参数构造函数。我只是被冲洗了吗?我认为问

c++ - protected 成员变量的错误共享?

考虑:classVector{doublex,y,z;//…};classObject{VectorVec1,Vec2;std::mutexMtx1,Mtx2;voidModifyVec1(){std::lock_guardLock(Mtx1);/*…*/}voidModifyVec2(){std::lock_guardLock(Mtx2);/*…*/}};如果互斥量或protected变量连续存储,并且在缓存时共享缓存行,这会导致某种“交叉锁定”吗?如果是这样,在互斥锁保护的变量之后(或之前)声明互斥锁是一个好习惯吗?将类与std::hardware_destructive_inte