标签: atomic

如何在C#中进行原子写入/追加,或者如何使用FILE_APPEND_DATA标志打开文件?

在大多数Unix和Posix符合操作系统下,使用O_APPEND执行open()操作系统调用向操作系统指示写入是原子追加和写入操作.出现这种情况,对于本地文件系统,当您执行写操作时,您知道它会附加到文件的末尾.

Windows操作系统通过将FILE_APPEND_DATA适当的参数传递给Win32 CreateFile()系统调用来支持相同的功能.

引用:

http://www.google.com/search?q=msdn+createfile
or: http://msdn.microsoft.com/en-us/library/aa363858(VS.85).aspx

http://www.google.com/search?q=msdn+IoCreateFileSpecifyDeviceObjectHint
or: http://www.google.com/search?q=msdn+IoCreateFileSpecifyDeviceObjectHint
Run Code Online (Sandbox Code Playgroud)

我的问题是,我无法确定如何使用Net Framework库在C#下获得此行为,有没有办法使用Net Framework获取此类行为?我不相信使用FileMode.Append会提供这样的行为.

.net c# atomic append

22
推荐指数
1
解决办法
6726
查看次数

具有std :: atomic成员变量的类的复制构造函数/赋值运算符出错

我有一个类似下面的课程.

#include <atomic>

static const long  myValue = 0;

class Sequence
{

public:

    Sequence(long initial_value = myValue) : value_(initial_value) {}


private:

     std::atomic<long> value_;
};

int main()
{
         Sequence firstSequence;
         Sequence secondSequence = firstSequence;
         return 0;
}
Run Code Online (Sandbox Code Playgroud)

我收到这样的编译错误,

test.cpp:21:36: error: use of deleted function ‘Sequence::Sequence(const Sequence&)’
test.cpp:5:7: error: ‘Sequence::Sequence(const Sequence&)’ is implicitly deleted because the default definition would be ill-formed:
test.cpp:5:7: error: use of deleted function ‘std::atomic<long int>::atomic(const std::atomic<long int>&)’
Run Code Online (Sandbox Code Playgroud)

这是默认的复制构造函数,赋值opertaor在这种情况下不起作用吗?

PS:我使用的是gcc 4.6.3版

c++ multithreading atomic c++11

22
推荐指数
4
解决办法
1万
查看次数

读取和写入LOCK_EX应该是原子的吗?

file_put_contents ( "file", "data", LOCK_EX )
Run Code Online (Sandbox Code Playgroud)

写作(意思是 - 获取锁定和写入)

file_get_contents ( "file", LOCK_EX )
Run Code Online (Sandbox Code Playgroud)

用于阅读(这意味着 - 获取锁定然后阅读)

它会抛出异常吗?提出错误?阻止直到获得锁定?或者至少 - 应该吗?有一天php会有这样的表现吗?

编辑:我知道可以使用重命名 - 我想知道答案...

php locking atomic blocking atomicity

21
推荐指数
2
解决办法
2万
查看次数

在这个角落的情况下,C++ 11内存排序保证是什么?

我正在编写一些无锁代码,我想出了一个有趣的模式,但我不确定它是否会在轻松的内存排序下表现得如预期.

解释它的最简单方法是使用一个例子:

std::atomic<int> a, b, c;

auto a_local = a.load(std::memory_order_relaxed);
auto b_local = b.load(std::memory_order_relaxed);
if (a_local < b_local) {
    auto c_local = c.fetch_add(1, std::memory_order_relaxed);
}
Run Code Online (Sandbox Code Playgroud)

请注意,所有操作都使用std::memory_order_relaxed.

显然,在这上,负载为执行的线程a,并b在之前必须完成if情况进行评估.

类似地,读取 - 修改 - 写入(RMW)操作c必须在评估条件之后完成(因为它以条件为条件).

我想知道的是,这段代码保证的价值c_local至少高达最新的值a_localb_local?如果是这样,如果放宽内存排序,这怎么可能?控制依赖是否与RWM操作一起充当某种获取范围?(请注意,在任何地方都没有相应的版本.)

如果上述情况属实,我相信这个例子也应该有效(假设没有溢出) - 我是对的吗?

std::atomic<int> a(0), b(0);

// Thread 1
while (true) {
    auto a_local = a.fetch_add(1, std::memory_order_relaxed);
    if (a_local >= 0) {    // Always true at runtime
        b.fetch_add(1, std::memory_order_relaxed);
    }
} …
Run Code Online (Sandbox Code Playgroud)

multithreading atomic memory-model c++11

21
推荐指数
1
解决办法
1899
查看次数

C++ 11标准是否保证std :: atomic <>是作为原子操作实现的?

我在一个交叉点,我试图在基于互斥锁的数据结构和无锁(可能无等待)的数据结构之间选择一个.

虽然挖掘得更深,但我没有发现C++ 11标准支持原子类型的原子操作这一事实,甚至对于基于宽度的积分也没有atomic_uint32_t.换句话说,它不仅仅是未被授予真正原子的std::atomic<>接口,唯一看起来它被赋予整个标准库中的原子的东西是.std::atomic_flag

这是真的还是我遗失了什么?这是什么原因?我的意思是标准称为"原子"的东西显然根本不是原子的,甚至允许使用互斥锁或阻止呼叫.

c++ multithreading atomic c++11

21
推荐指数
2
解决办法
3082
查看次数

std :: shared_ptr和std :: experimental :: atomic_shared_ptr有什么区别?

我阅读以下通过文章安东尼威廉姆斯和我除了理解为原子共享计数std::shared_ptrstd::experimental::atomic_shared_ptr实际指针到共享对象也是原子?

但是,当我读到的引用计数的版本lock_free_stack在安东尼的书中描述了关于C++并发似乎对我来说,同样aplies也是std::shared_ptr,因为功能,如std::atomic_load,std::atomic_compare_exchnage_weak被应用到的实例std::shared_ptr.

template <class T>
class lock_free_stack
{
public:
  void push(const T& data)
  {
    const std::shared_ptr<node> new_node = std::make_shared<node>(data);
    new_node->next = std::atomic_load(&head_);
    while (!std::atomic_compare_exchange_weak(&head_, &new_node->next, new_node));
  }

  std::shared_ptr<T> pop()
  {
    std::shared_ptr<node> old_head = std::atomic_load(&head_);
    while(old_head &&
          !std::atomic_compare_exchange_weak(&head_, &old_head, old_head->next));
    return old_head ? old_head->data : std::shared_ptr<T>();
  }

private:
  struct node
  {
    std::shared_ptr<T> data;
    std::shared_ptr<node> next;

    node(const T& data_) : data(std::make_shared<T>(data_)) {} …
Run Code Online (Sandbox Code Playgroud)

c++ concurrency smart-pointers atomic c++11

21
推荐指数
3
解决办法
6909
查看次数

为什么线程清理程序会抱怨获取/释放线程栅栏?

我正在学习不同的记忆顺序。

\n

我有这段代码,它可以工作并通过 GCC 和 Clang 的线程清理程序

\n
#include <atomic>\n#include <iostream>\n#include <future>\n    \nint state = 0;\nstd::atomic_int a = 0;\n\nvoid foo(int from, int to) \n{\n    for (int i = 0; i < 10; i++)\n    {\n        while (a.load(std::memory_order_acquire) != from) {}\n        state++;\n        a.store(to, std::memory_order_release);\n    }\n}\n\nint main()\n{    \n    auto x = std::async(std::launch::async, foo, 0, 1);\n    auto y = std::async(std::launch::async, foo, 1, 0);\n}\n
Run Code Online (Sandbox Code Playgroud)\n

我认为如果它最终没有返回,则“获取”加载是不必要的from,那么“获取”负载是不必要的,因此我决定使用“宽松”负载,然后使用“获取”栅栏。

\n

我期望它能工作,但它被线程清理程序拒绝了,线程清理程序声称并发state++是数据竞争。

\n
#include <atomic>\n#include <iostream>\n#include <future>\n    \nint state = 0;\nstd::atomic_int …
Run Code Online (Sandbox Code Playgroud)

c++ atomic memory-barriers stdatomic thread-sanitizer

21
推荐指数
1
解决办法
1244
查看次数

为什么Interlocked.Add没有超载接受双打作为参数?

我完全理解Threading.Interlocked类提供的原子性; 但是,我不明白为什么Add函数只提供两个重载:一个用于Integers,另一个用于Longs.为什么不双打,或任何其他数字类型?

显然,更改Double的预期方法是CompareExchange; 我认为这是因为修改Double比修改Integer更复杂.我还不清楚为什么,如果CompareExchange和Add都能接受整数,他们也不能同时接受双打.

.net c# vb.net multithreading atomic

20
推荐指数
3
解决办法
7463
查看次数

IEnumerable Linq方法是线程安全的吗?

我想知道Linq扩展方法是否是原子的?或者,在进行任何迭代之前,我是否需要跨线程使用的lock任何IEnumerable对象?

声明变量volatile对此有何影响?

总结一下,以下哪项是最好的,线程安全,操作?

1-没有任何锁:

IEnumerable<T> _objs = //...
var foo = _objs.FirstOrDefault(t => // some condition
Run Code Online (Sandbox Code Playgroud)

2-包括锁定语句:

IEnumerable<T> _objs = //...
lock(_objs)
{
    var foo = _objs.FirstOrDefault(t => // some condition
}
Run Code Online (Sandbox Code Playgroud)

3-将变量声明为volatile:

volatile IEnumerable<T> _objs = //...
var foo = _objs.FirstOrDefault(t => // some condition
Run Code Online (Sandbox Code Playgroud)

c# multithreading atomic thread-safety

20
推荐指数
2
解决办法
1万
查看次数

为什么不完全实现原子双重

我的问题很简单.为什么没有std::atomic<double> 完全实施?我知道它与互锁变量访问有关.但是我真的没有看到,为什么这不应该是双倍的.

它被指定可以使用任何普通的可复制类型.当然,双重是其中之一.所以基本操作应该没问题(设置,阅读等).但是,在整数上可能有一组额外的操作(fetch_add,++,+ =等).

双重与这些类型的差别很小.它是原生的,三维可复制的等等.为什么标准不包括这些类型的双重?

c++ floating-point atomic compare-and-swap stdatomic

20
推荐指数
2
解决办法
1万
查看次数