2012-01-14 13 views

答えて

0

は、manページを参照してください:http://ds9a.nl/futex-manpages/futex2.htmlを、あなたはまだその後必要があるものがあります場合はお知らせ。あなたの質問からわからないことの1つは、値が更新されたことを通知する別の関数を使用するか、タイムアウトを使用するかどうかということです。

0

私はfutexの使用にはかなり新しいですが、ここでは私がうまくいくはずの解決策があります。私はこれをまったくテストしていないことを警告してください、そして、それは、いくつかの調整をしてより速く作ることができます。

void waitUntilNotEqual(volatile int* addr, int value) { 
    while (*addr == value) { 
    futex(addr, FUTEX_WAIT, value, 0, 0, 0); 
    } 
} 

void changeValue (volatile int* addr, int newValue) { 
    int oldValue = *addr; 
    if (oldValue != newValue) { 
    *addr = newValue; 
    futex(addr, FUTEX_WAKE, INT_MAX, 0, 0, 0); 
    } 
} 

これが正しく動作するためには、waitUntilNotEqualに渡されたアドレスのすべての変更はchangeValueを介して行われるべきです。 FUTEX_WAKEコールのINT_MAX値は、このフューテックスで待機しているすべてのスレッドをウェイクアップする必要があることを示します。 changeValue関数のif文は、無意味な起床を避ける最適化です。最後に、FUTEX_WAITコールは信号から偽りに戻ってくる可能性があるため、ループ内に保持する必要があります。

あなたが解決しようとしている問題について詳しく説明していないことも指摘しておきます。これは、このコードがおそらく最も単純なユースケースの場合にのみ正しいことを意味します。あなたがより良いあなたの現在の問題に適応何かをしたい場合は、あなたがしている場合、私はより多くの細部(スレッド数、waitUntilNotEqualまたはchangeValueで可能な同時スレッドの、数、などと呼ばれているwaitUntilNotEqualchangeValueでコンテキスト)

が必要フューテックスを正しく使う方法をもっと学ぶことに興味があるなら、私はFutexes Are Tricky紙を勧めます。

関連する問題