2013-07-03 14 views
10

私はstd::stringboost::lockfree::queueに入れようとしているので、スレッドは新しいデータで互いに更新できます。std :: stringをboost :: lockfree :: queue(または代替)に入れる方法は?

私はboost::lockfree::queue<std::string> updated_data;を使用しようとすると、g++は言う:

In instantiation of 'class boost::lockfree::queue >':

error: static assertion failed: (boost::has_trivial_destructor::value)

error: static assertion failed: (boost::has_trivial_assign::value)

私はshown generally what these errors meanしてきたが、私は、C++に新ほとんどのブランドだと私は、今までにこの自分自身を固定のない希望を持っていません。

lockfreeのスレッド間でテキストデータを渡す別の方法はありますか?そうでない場合はにstd::stringを入れる方法を教えてください。

答えて

2

キューに未処理のポインタを置くと、古いstd::stringsは不要になったときに解放する方法がないため、リークされます。これは、スレッドセーフな方法でロックを取ることなくオブジェクトを解放する方法がないためです(ハザードポインタのようないくつかの技以外ではboost::lockfree::queueは使用しません)

技術的な理由から、 boost::lockfree::queueは、些細な代入演算子と簡単なデストラクタを必要とします。つまり、デストラクタでメモリを解放する必要のあるデータ型をオブジェクトに含めることも、格納することもできません。たとえば、std::stringです。

+2

これはあまり真実ではありません:キューに生のポインタを置いて、ポインタをポップすると解放することができます。例えば、 'queue-> consume_all([std :: string * str){do_something(str); str;});' – Zero

10

boost::lockfree::queueドキュメントには、含まれているitemmには、簡単なコピー割り当てとデストラクタが必要であることが明確に記載されています。std::stringにはありません。

1人のプロデューサと1人のコンシューマがいる場合は、デフォルトの構築性とコピー可能性だけを必要とするspsc_queuehttp://www.boost.org/doc/libs/1_54_0/doc/html/boost/lockfree/spsc_queue.html)を使用できます。

プロデューサまたはコンシューマが複数ある場合は、通常のロックキュー(または動的割り当てを使用しないカスタム文字列)を使用することになります。

+0

ありがとう、すばらしい、spsc_queueに頭を上げてください! – Austin

8

I have no hope of ever fixing this myself, as I'm almost brand new to c++.

次に、私はロックフリーキューのようなものを混乱させているのだろうかと思います。ポインタは些細なタイプですので、キューに許可されているので、

Is there an alternative way to pass text data between threads with lockfree ?

はい、あなただけの、キュー内のデータへのstd::string*のポインタを格納することができます。同様に、reference_wrapper<std::string>を保存することができます。その問題は、それらを指し示すために、他の場所に文字列を格納する必要があることです。そのため、あなたが行ったことは、問題を別の場所に移動することです(例えば、各スレッドロックされていないキューに外部管理された文字列へのポインタを格納しますが、スレッド単位のリストからstringを削除して安全にいつ成長して成長するかはわかりません)。

std::queue<std::string>をシンプルに使用し、boost::mutexboost::condition_variableとの独自の同期を実行するか、スレッドセーフ(ロックフリーではありません)キューの既存の実装を探します。

+0

これは、キューに生ポインタを格納することさえ考慮しなかったので、+1を取得します。 –

+0

既に何が行われていますか?生ポインタを保存しますか?実際のオブジェクトはどこに置かれますか?コンテナに管理されていない生ポインタを置くのは悪い習慣ですが、メモリがリークするのは簡単です –

+0

これで問題は解決しましたが、今はプログラミングの単純な問題です(http://www.catb ) –

関連する問題