草庐IT

double-checked-locking

全部标签

c++ - Effective placement of lock_guard - 来自 Effective Modern C++ 的第 16 条

在第16项:“使const成员函数线程安全”中有一段代码如下:classWidget{public:intmagicValue()const{std::lock_guardguard(m);//lockmif(cacheValid)returncachedValue;else{autoval1=expensiveComputation1();autoval2=expensiveComputation2();cachedValue=val1+val2;cacheValid=true;returncachedValue;}}//unlockmprivate:mutablestd::mute

c++ - std::lock 仍然导致死锁

std::lock是用来防止死锁的吧?但是在我的测试中,它仍然导致死锁。你能检查一下我的测试代码,看看我是否使用错误吗?std::mutexm1;std::mutexm2;voidfunc1(){std::unique_locklock1(m1,std::defer_lock);printf("func1lockm1\n");std::this_thread::sleep_for(std::chrono::seconds(2));std::unique_locklock2(m2,std::defer_lock);printf("func1lockm2\n");std::lock(m1,

c++ - 在 POSIX 上生成随机 double 的最佳方法是什么?

我想在[0.0,1.0)范围内得到均匀分布如果可能,请让实现使用来自/dev/urandom的随机字节。如果您的解决方案是线程安全的,那就太好了。如果您不确定,请指出。参见somesolution我看了其他答案后想到的。 最佳答案 这似乎是个不错的方法:unsignedshortintr1,r2,r3;//letr1,r2andr3holdrandomvaluesdoubleresult=ldexp(r1,-48)+ldexp(r2,-32)+ldexp(r3,-16);这是基于NetBSD的drand48实现。

C++ -malign-double 编译器标志

我需要一些有关C++编译器标志的帮助。我正在使用一个库,它是从Windows到Linux的端口,必须使用-malign-double标志编译,“为了Win32兼容性”。据我了解,这意味着我也必须用这个标志编译我自己的代码吗?其他.so共享库怎么样,是否也使用此标志重新编译了它们?如果是这样,有什么办法解决这个问题吗?我是一个Linux新手(和C++),所以即使我尝试重新编译我在我的项目中使用的所有库,递归地找到所有库的源代码和它们的库也太复杂了'依赖并重新编译一切。编辑:感谢您的回答。一些背景:这个库控制初始化和访问USB连接的相机。问题是如果没有这个标志,奇怪的事情就会开始发生。看似

c++ - 以二进制形式打印 double

在BruceEckel的“ThinkinginC++”中,给出了一个打印double值的程序以二进制形式。(第3章,第189页)intmain(intargc,char*argv[]){if(argc!=2){cout(&d);for(inti=sizeof(double);i>0;i-=2){printBinary(cp[i-1]);printBinary(cp[i]);}}这里当i=8时打印cp[i](假设double是8个字节),这不是未定义的行为吗?我的意思是这段代码不起作用,因为它不打印cp[0]。 最佳答案 A1:是的,

c++ - 将位设置为 double 并使用 g++ 的优化标志进行编译

我正在尝试将位设置为double(IEEE标准754)。说我想“构建”一个3,我会设置双浮点表示的第51位和第62位,这样我得到二进制1.1*2,十进制为3。我写了这个简单的main:intmain(){doublet;uint64_t*i=reinterpret_cast(&t);uint64_tone=1;*i=((one这个的输出将是88883当使用g++4.3编译并且没有优化时。但是,如果我添加-O2或-O3优化标志,我会得到一个奇怪的行为。也就是说,如果我让main保持原样,我会得到相同的输出。但是,如果我删除输出4sizeof的行,那么我将得到输出0没有sizeof输出的未

c++ - C中double **和double (*)[2]的区别

double**和double(*)[2]有什么区别。如果我理解得很好,double**是指向double指针的指针,因此它可以是任意大小的二维数组,而double(*)[2]是指向double[2]数组的指针.那么如果是对的,如何才能成功传递给函数。例如:voidpcmTocomplex(short*data,double*outm[2])如果我传递double(*)[2]作为参数,我会收到以下警告:warning:passingargument2of‘pcmTocomplex’fromincompatiblepointertypenote:expected‘double**’but

c++ - 使用 try_lock boost 锁定

我正在尝试解决Boost1.46.1的锁定问题-我尝试了一些方法但我不满意-因此很想听听干净的意见。线程A:必须始终等待并获取关键数据部分的锁更新一些关键数据手动解锁(或范围)线程B-绝不能阻塞(try_lock?)-如果获得锁,从提到的关键部分读取数据我不确定我是否需要shared_lock或者我是否可以用其他方式解决这个问题。编辑,我的代码如下:线程A:{//Criticalsectionboost::mutex::scoped_locklock(_mutex);}线程B:boost::mutex::scoped_locklock(_mutex,boost::try_to_lock

c++ - 具有 double 、 float 和整数数据类型的英特尔 MKL 矩阵产品性能

我正在试验英特尔MKL库,使用它们提供的Boost::uBLAS接口(interface)(包括mkl_boost_ublas_matrix_prod.hpp)执行矩阵乘法。我的数据只是整数,所以我尝试将我的矩阵模板类型更改为int并且性能下降,这似乎主要是由于代码仅使用单个CPU内核而不是我可用的12个。我在MKL文档中找不到任何内容来解释为什么整数没有使用MKL的OpenMP多线程功能(我猜他们根本没有使用MKL?)。此外,与float相比,我发现double的性能下降了50%。问题:为什么float和double之间存在差异?为什么我不能使用整数?这是我从下面的代码中得到的结果:

c++ - 成员函数检查 : Implement compilation-time checkings with C++11 features

我读到C++11有足够的静态检查(编译时),以便实现C++11的大部分内容(已删除)。(我在最近关于已删除概念的问题的评论中读到过此内容...-该问题因不具有建设性而很快被关闭)。下面的C++03代码仅检查类中是否存在成员函数(我的模板类要在该类上工作)。这里有4个搜索的成员函数,我总是使用相同的模式:定义函数原型(prototype)的typedef如果类型名称TExtension没有定义这样的成员函数,或者如果它有不同的原型(prototype),则调用static_cast会中断编译代码如下:templateclass{...voidcheckTemplateConcept(){