Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/selenium/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 在没有同步的情况下读取同时递增的int是否安全_C++_Multithreading_Integer - Fatal编程技术网

C++ 在没有同步的情况下读取同时递增的int是否安全

C++ 在没有同步的情况下读取同时递增的int是否安全,c++,multithreading,integer,C++,Multithreading,Integer,线程A只读取int,线程B只增加int 我不需要线程A在值上是最新的,当它实际上是9时,它可以是8,这没关系,因为这是一个循环,他会在某个点上达到9 问题是我有一个固定大小的数组,一个int存储当前索引(线程A读取的最后一个位置),另一个int存储数组的“大小”。int都从0开始,每个更新线程A都会查看size int是否大于index int,如果是,则会捕获并读取新值 我想知道我是否可以避免同步,因为我不需要精确的精度 在不同步的情况下读取同时递增的int是否安全 不,不安全 竞争条件至少涉

线程A只读取int,线程B只增加int

我不需要线程A在值上是最新的,当它实际上是9时,它可以是8,这没关系,因为这是一个循环,他会在某个点上达到9

问题是我有一个固定大小的数组,一个int存储当前索引(线程A读取的最后一个位置),另一个int存储数组的“大小”。int都从0开始,每个更新线程A都会查看size int是否大于index int,如果是,则会捕获并读取新值

我想知道我是否可以避免同步,因为我不需要精确的精度

在不同步的情况下读取同时递增的int是否安全

不,不安全

竞争条件至少涉及一个写入线程。(如果所有线程都只是读卡器线程,则不存在争用条件,也不需要锁定)

在您的例子中,有两个线程都是编写器线程(即修改共享资源)。所以有一个竞赛条件。您需要实现对共享资源(即计数器)的锁定,以实现线程安全

在不同步的情况下读取同时递增的int是否安全

不,不安全

竞争条件至少涉及一个写入线程。(如果所有线程都只是读卡器线程,则不存在争用条件,也不需要锁定)


在您的例子中,有两个线程都是编写器线程(即修改共享资源)。所以有一个竞赛条件。您需要实现对共享资源(即计数器)的锁定以实现线程安全。

否。行为未定义。充其量,你的“不需要精确的准确性”变成了“可以容忍荒谬的价值”

假设一个线程刚刚跨字节边界增加了一个值。例如,在具有8位字节的系统上从255变为256。在增量之前,高位字节的值为0。增量后,低字节的值为0。此处读数为0是否可以接受?因为这就是您可以看到的:在写入低位字节之后和写入新字节之前的线程切换将导致另一个线程将两个字节都视为零


注意这是一个省力的参数,旨在让您了解同步解决的各种问题。其目的不是建议良好做法。良好的实践需要同步,无论您猜测没有同步的结果是什么。

否。行为未定义。充其量,你的“不需要精确的准确性”变成了“可以容忍荒谬的价值”

假设一个线程刚刚跨字节边界增加了一个值。例如,在具有8位字节的系统上从255变为256。在增量之前,高位字节的值为0。增量后,低字节的值为0。此处读数为0是否可以接受?因为这就是您可以看到的:在写入低位字节之后和写入新字节之前的线程切换将导致另一个线程将两个字节都视为零


注意这是一个省力的参数,旨在让您了解同步解决的各种问题。其目的不是建议良好做法。良好的实践需要同步,无论您猜测没有同步的结果可能是什么。

没有同步,不会指定结果。实际上,我希望你得到8或9,在这种情况下。但它可能是任何东西。在C++规范中,没有任何东西禁止你在真空中得到42、17或光速。结果可能是任何东西。更实际的说法是:想想如果int存储在寄存器的至少一侧,会发生什么。为了绝对安全,您最好从所需的同步开始,并且只有当您确定这是瓶颈时,才尝试对其进行微调。您肯定无法避免同步,但您可以使用std::atomic,它对于增量来说速度非常快。引擎盖下会有某种形式的这是一个非常快的CPU级原子操作。没有同步,结果没有被指定。实际上,我希望你得到8或9,在这种情况下。但是它可以是任何东西。C++中没有任何东西禁止你得到,因此,42,-17或真空中的光速。结果可以。可以是任何东西。更实际的说法是:想想如果int存储在寄存器中至少有一面会发生什么。为了绝对安全,你最好从你需要的同步开始,并且只有当你确定这是瓶颈时才尝试微调它。你肯定不能避免同步,但你可以使用std::原子的,这将是非常快的增量。在引擎盖下会有某种形式的[和添加],这是一种非常快速的CPU级原子操作。竞争条件只需要一个写入程序和一个读取程序,而不需要至少两个写入程序。不要向我道歉。在修复或删除它之前,你会被投票否决的。@PeteBecker我不关心否决票,这不是问题。我正在阅读你的答案,你的答案仍然不准确。有问题中只有一个写入程序,所需的是某种形式的同步,不一定涉及锁定。查找
s。有些可以是无锁的。竞争条件只需要一个写入程序和一个读卡器,而不是至少两个写入程序。不要向我道歉。在修复或删除它之前,你会被投票否决@彼得·贝克尔:我不关心反对票,不是问题。我在读你的答案仍然不准确。问题中只有一位作者,需要的是某种形式的同步,这确实是个问题