2012-06-09 16 views
12

C++ 11ドラフトn3242のセクション20.7.2.5を読むと、shared_ptrのアトミック操作があるように見えます。これにより、GCを心配することなく複雑な構造に対してロックフリーを行うことができます/メモリーリーク。C++でのshared_ptrのアトミック操作11

しかし、GCC-4.7.0では正常に使用できませんでした。私は単純に次のプログラム

#include <atomic> 
#include <memory> 
#include <string> 

struct X { 
    int x; 
    double y; 
    std::string s; 
}; 

int main() { 
    std::shared_ptr<X> x(new X); 
    auto p = std::atomic_load(&x); 
} 

をテストし、それがコンパイラエラーがあります。

c.cpp:13:33: error: no matching function for call to ‘atomic_load(std::shared_ptr<X>*)’ 

誰もが私がここに逃したものを知っていますか?それとも単にgccがまだ実装していないのですか?

+0

'shared_ptr <>'の内部参照カウントは、特別な記述をしなくてもアトミックにインクリメントされ、デクリメントされます。 'atomic_load'とまったく何をしようとしていますか? – ildjarn

+0

@ildjarn、こちらを読んでください。http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2008/n2674.htm –

+0

@ildjarn shared_ptr変数が指しているスレッドをスレッドが変更している場合、回避する必要がありますshared_ptr自体にアクセスすると、データ競合が発生します。 – bames53

答えて

2

libstdC++にまだ入っていないようです。

libC++にも含まれていません

VS11ベータ版があります。私はこれがVS11のライブラリでlibC++にない最初のものだと思います。

+0

これはGCCで実装できるのですか? –

+0

いいえ、考えていません.... – bames53

+0

VS11が私の手で持っていないので、VS11がatomic_load/atomic_store/atomic_compare_and_exchangeをどのように実装しているのか不思議です。スピンロックで実装されていますか? –

3

新しいatomic_shared_ptrクラスの賛成でshared_ptrのためのこれらのatomic_store/atomic_load法を廃止する提案があります:http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2014/n4162.pdf

ですから、atomic_loadとlibstC++バージョンを取得する時点で、それは非常によく、新しい原子のポインタが含まれていてもよいですすでにいくつかの面で優れています。

MSVC STLはこれまでにこれらのメソッドを実装しており、libC++も完全なC++ 11/14準拠を主張しているため、最新のバージョンで利用可能でなければなりません。

-6

-std = C++ 11を使用してclang ++を使用して、動作させるコードをコンパイルします。

関連する問題