为什么fetch_sub不是一个释放操作?

时间:2018-05-24 03:24:18

标签: c++ multithreading c++11 concurrency memory-barriers

引自 C ++并发行动 $ Listing 5.9

  

A <div class="modal-body"> <div> <label for="type">article</label> <select id="article" name="article" class="form-control"> {{#each articles}} <option data-price="{{price}}">{{name}}</option> {{/each}} </select> </div> <input type="text" class="form-control" name="desc" id="desc" placeholder="Description" value="{{desc}}"> <input type="text" class="form-control" name="quantity" id="quantity" placeholder="Qté commandée" value="{{quantity}}"> <input type="text" class="form-control" name="price" id="price" placeholder="Prix Unitaire" value="{{price}}"> <input type="text" class="form-control" name="tax" id="tax" placeholder="Taxes" value="{{tax}}"> </div> <div class="modal-footer"> <button type="button" class="btn btn-default" data-dismiss="modal">Quité</button> <button type="button" name="add" id="add" onclick="isValid()" class="btn btn-primary" data-dismiss="modal">Ajouter</button> </div> <script> $(document).ready(function () { $('#article').change(function () { var price = $(this).find(':selected').attr('data-price'); $('#price').attr('value', price); }); }); </script>   使用fetch_sub语义的操作不会与任何内容同步,   即使它存储了一个值,因为它不是一个发布操作。同样,一家商店   无法与具有memory_order_acquire语义的fetch_or同步,因为   memory_order_release的读取部分不是获取操作。

我很难理解上面的段落。如果是fetch_or 使用fetch_sub语义的操作不会与任何内容同步,为什么memory_order_acquire的接口会为我们留下内存顺序参数,如下所示?

fetch_sub

1 个答案:

答案 0 :(得分:2)

  1. “与...同步”是单向的而不是可交换的。 “与B同步”并不意味着“B与A同步”(实际上恰恰相反),与人们对英语的期望不同。因此,memory_order_acquire RMW操作无法与任何内容同步,但memory_order_release存储与memory_order_acquire RMW操作同步,该操作获取从存储读取的值。同样,虽然memory_order_release商店未与memory_order_release RMW同步,但memory_order_release RMW可以与memory_order_acquire加载同步。
  2. memory_order_acq_rel