この方法(私は機能がいくつか追加のパラメータを必要とする場合があります実現):フューテックスを使用してこのメソッドを実装するにはどうすればよいですか?
void waitUntilNotEqual(volatile int* addr, int value)
{
while (*addr == value) {}
}
この方法(私は機能がいくつか追加のパラメータを必要とする場合があります実現):フューテックスを使用してこのメソッドを実装するにはどうすればよいですか?
void waitUntilNotEqual(volatile int* addr, int value)
{
while (*addr == value) {}
}
は、manページを参照してください:http://ds9a.nl/futex-manpages/futex2.htmlを、あなたはまだその後必要があるものがあります場合はお知らせ。あなたの質問からわからないことの1つは、値が更新されたことを通知する別の関数を使用するか、タイムアウトを使用するかどうかということです。
私は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
で可能な同時スレッドの、数、などと呼ばれているwaitUntilNotEqual
とchangeValue
でコンテキスト)
が必要フューテックスを正しく使う方法をもっと学ぶことに興味があるなら、私はFutexes Are Tricky紙を勧めます。