草庐IT

c++ - 使用 std::atomic::compare_exchange_strong 时,对 std::atomic 的写入是否会被其他线程看不到?

std::atomicg_atomic;voidthread0(){intoldVal=0;intnewVal=1;while(g_atomic.compare_exchange_strong(oldVal,newVal,std::memory_order_acq_rel,std::memory_order_acquire)){//forevercountingfrom0to100untilunexpectedvalueappearsoldVal=newVal;newVal=(oldVal+1)%100;};}voidthread1(){//setunexpectedvalueg_at

c++ - 降低写入大型二进制文件的性能

在我们的一个软件中,我们正在创建记录并将它们存储在二进制文件中。一旦写入操作完成,我们就会读回这个二进制文件。问题是,如果这个二进制文件小于100MB,那么它的性能就足够了,但是一旦这个文件变大,它的性能就会受到影响。所以,我想到将这个大的二进制文件(>100MB)拆分成较小的文件(如果你们能对此发表评论,那将是非常大的帮助。谢谢 最佳答案 或许您可以尝试使用Sqlite数据库。 关于c++-降低写入大型二进制文件的性能,我们在StackOverflow上找到一个类似的问题:

将ints写入文件并读取它们,hasnext()返回false

我必须将100个随机整数写入文件,并以越来越多的顺序显示它们。printwriter写了它们,但是当我尝试从文件中读取时,方法hasNext()返回false,我不明白为什么。我想问题是打印稿。try(PrintWriteroutput=newPrintWriter(file);Scannerinput=newScanner(file)){for(inti=0;i看答案你需要flush输出流将更改写入文件。...for(inti=0;i此外,close在这种情况下,会自动冲洗流-因此,如果您尝试在try块,你将看到更改。为一个PrintWriter,flush每当打印新线时也被称为printl

c++ - Jsoncpp 错误地写入浮点值

我正在使用jsoncpp读取JSON文件。当我写回文件时,我的浮点值略有偏差。为了进行测试,我决定将文件解析为Json::Value,然后将该值写回到文件中。我希望它看起来一样,但浮点值不同。例子:"Parameters":{"MinXValue":0.1,"MaxXValue":0.15,"MinYValue":0.25,"MaxYValue":1.1,"MinObjectSizeValue":1}写成:"Parameters":{"MinXValue":0.10000000000000001,"MaxXValue":0.14999999999999999,"MinYValue":0

c++ - 异步写入位数组

TL;DR如何安全地执行单个位更新A[n/8]|=(1对于A是一大堆chars(即,在使用C++11的n进行并行计算时,设置A的的位为真)图书馆?我正在执行一个易于并行化的计算。我正在计算自然数的某个子集的元素,我想找到该子集中不的元素。为此,我创建了一个巨大的数组(如A=newchar[20l*1024l*1024l*1024l],即20GiB)。n如果n,则此数组的位为真位于我的集合中。并行执行并使用A[n/8]|=(1将位设置为真时,我似乎丢失了少量信息,据推测是由于同时处理A的同一字节(每个线程必须首先读取字节,更新单个位并写回字节)。我该如何解决这个问题?有没有办法将此更新作

c++ - std::stringstream 获取写入数据的有效方式,复制到另一个流

在不编写自定义rdbuf的情况下,有什么方法可以有效地使用stringstream吗?也就是说,满足这些要求:可以重置流并重新开始写入,而无需释放之前的内存获取写入数据的constchar*(连同长度)而不创建临时对象在不创建临时字符串的情况下填充流如果有人能给我一个明确的“不”,那就太好了。现在,我也使用boost,所以如果有人可以提供一个boost的替代方案,那就太好了。它必须同时提供istream和ostream接口(interface)。 最佳答案 使用boost::interprocess::vectorstreamorb

c++ - 指针写入不是原子的最常见配置是什么?

我对多线程很感兴趣。该领域有很多陷阱,例如,不能保证指针写入是原子的。我明白了,但想知道在实际情况下最流行的当前配置是什么?例如,在我的MacbookPro/gcc上,指针写入看起来绝对是原子的。 最佳答案 这主要是指针宽度大于CPU架构宽度的CPU架构的问题。例如,在ATmega上CPU,8位架构,地址空间是16位。如果没有任何特定指令来加载和存储16位地址,则至少需要两条指令来加载/存储指针值。 关于c++-指针写入不是原子的最常见配置是什么?,我们在StackOverflow上找到

c++ - 我可以使用 memcpy 写入多个相邻的标准布局子对象吗?

免责声明:这是试图深入研究一个更大的问题,因此请不要纠结于该示例在实践中是否有意义。而且,是的,如果您想复制对象,请使用/提供复制构造函数。(但请注意,即使是示例也不会复制整个对象;它会尝试在几个相邻的(Q.2)整数上blit一些内存。)给定一个C++StandardLayoutstruct,我可以使用memcpy一次写入多个(相邻的)子对象?完整示例:(https://ideone.com/1lP2Gdhttps://ideone.com/YXspBk)#include#include#include#include#include#includestructMyStandardLa

c++ - 并发写入同一缓存行中的不同位置

假设我有一个C++11应用程序,其中两个线程使用指向原始类型的简单指针写入不同但附近的内存位置。我能确定这两个写入最终都会在内存中结束吗(可能在两者都达到boost::barrier之后),或者是否存在两个CPU内核都拥有自己的包含该数据的缓存行的风险,并且第二个内核刷新它的对RAM的修改会覆盖和撤消第一次写入所做的修改吗?我希望缓存一致性能够在所有情况下和所有符合C++11内存模型的设置上为我解决这个问题,但我想确定。 最佳答案 是的,缓存一致性机制会处理这个问题。这叫做Falsesharing并且应该通过更好地分离数据来提高性能

c++ - 从文件中读取和写入字节 (c++)

我想我可能必须使用fstream对象,但我不确定如何使用。本质上,我想将文件读入字节缓冲区,修改它,然后将这些字节重写到文件中。所以我只需要知道如何进行字节i/o。 最佳答案 #includeifstreamfileBuffer("inputfilepath",ios::in|ios::binary);ofstreamoutputBuffer("outputfilepath",ios::out|ios::binary);charinput[1024];charoutput[1024];if(fileBuffer.is_open())