0

マルチタッチアプリケーションがあります。udp パケットを送信する 3 つの ccv アプリケーションがあります。作成されたアプリケーションは、マルチスレッド化された ofxTuio を介してこれらのパケットをすべて受信します。これらのタッチは、単一のスレッドで記述したコードに反映されます。展示品があります。それらにはそれぞれ、含まれるすべてのオブジェクトへのポインターを含むリストがあります。たとえば、onEnterFrame、addChild、removeChild; と書きました。actionscript で見られる表示リストの構文に似た関数。ただし、マルチスレッドの tuio イベントが原因で、オブジェクトのリストで反復エラー (同時実行性) の問題が発生しています。これを防ぐにはどうすればよいでしょうか。これらのリストは複数のスレッドでアクセスされていないため、ロック (ミューテックス) は適切ではないようです。このリストのカスタム キューを作成しました。このキューでは、オブジェクトがリストに削除または追加されている間は反復されず、いくつかのブール値とキューイング用の追加リストが含まれています。人々はこのようなことに出くわしたと思いますが、適切な練習は何ですか?

4

3 に答える 3

2

複数のスレッドがある場合、フラグは十分ではありません。ミューテックスまたはその他のクリティカルセクションを使用して、読み取りと書き込みのアクセスをロックします。特に非同期または未承諾のイベントがある場合は、それが目的です。

于 2012-04-10T20:31:19.920 に答える
1

ミューテックスまたはアトミックな compare_and_swap 命令を使用して、データ構造をスレッドセーフにします。

于 2012-04-10T20:41:15.987 に答える
0

std :: listを使用している場合、リストから削除してもイテレータは無効になりません。実際、問題が発生するためには、削除する要素を反復処理する必要があります。シングルスレッドでこのように処理するようにアルゴリズムを構造化できる場合は、これで十分な場合があります。

どのようなイテレータエラーが発生しているのか知りたいのですが、互換性のないエラーが発生していますか?表示オブジェクトはどのようにリストを取得しますか?このキューを介して?オブジェクトにリストが追加されたら、リストを変更できますか?

于 2012-04-10T22:13:56.823 に答える