私は学校プロジェクトに取り組んでいます(私の制限事項を説明しています)。私の質問は、NACHOSでセマフォなしでロックを実装する方法です。 NACHOSの具体的な回答は素晴らしいですが、私が探しているのは正しい方向へのプッシュです。これまでのところ、私の理解から、モニターはセマフォーを使用するロックを使用しています(mutexは本当です)。最初は、セマフォーをモニターと置き換えてロックを実装すると考えましたが、これは意味をなさないものでした。セマフォなしでロックを実装する
2
A
答えて
0
ビジー待機し、セマフォを必要としないスピンロックについて考えてみてください。ユニプロセッサではスピンロックは使用されません。
0
ロックはThread:Sleepで実装できます。
class Lock {
public:
Lock(char* debugName); // initialize lock to be FREE
~Lock(); // deallocate lock
char* getName() { return name; } // debugging assist
void Acquire(); // these are the only operations on a lock
void Release(); // they are both *atomic*
bool isHeldByCurrentThread() { return (thread == currentThread); } // true if the current thread
// holds this lock. Useful for
// checking in Release, and in
// Condition variable ops below.
private:
char* name; // for debugging
// plus some other stuff you'll need to define
Thread *thread; //the thread who holds this lock
enum value {FREE, BUSY};
List *queue;
};
Lock::Lock(char* debugName):name(debugName), thread(NULL), value(FREE), queue(new List())
{ }
Lock::~Lock()
{
delete queue;
}
void Lock::Acquire()
{
IntStatus oldLevel = interrupt->SetLevel(IntOff); // disable interrupts
if (value == BUSY) {
queue->Append((void *)currentThread);
currentThread->Sleep();
}
value = BUSY;
thread = currentThread;
(void) interrupt->SetLevel(oldLevel); // re-enable interrupts
}
void Lock::Release()
{
Thread *nextThread;
IntStatus oldLevel = interrupt->SetLevel(IntOff); // disable interrupts
nextThread = (Thread *)queue->Remove();
if (nextThread != NULL) // make thread ready, consuming the V immediately
scheduler->ReadyToRun(nextThread);
value = FREE;
(void) interrupt->SetLevel(oldLevel); // re-enable interrupts
}
0
まず、ロックの現在の所有者が現在のスレッドであるかどうかを確認します。次に、ロックを達成するために割り込みのオン/オフとスリープを使用します。スレッドがスリープから復帰した後、スレッドをスリープ状態にすることはレディキューにしか渡されないため、ロックがビジー状態かフリー状態かを再度確認する必要があります。このスレッドがロックを獲得する前に、ある他のスレッドが再びロックを獲得することがあります。
void Lock::Acquire() {
ASSERT(!isHeldByCurrentThread()); // cannot acquire a lock twice
IntStatus oldLevel = interrupt->SetLevel(IntOff); // disable interrupts
while (freeOrBusy == 'b') {
queue->Append((void *)currentThread);
currentThread->Sleep();
}
freeOrBusy = 'b';
currentHolder = currentThread;
(void) interrupt->SetLevel(oldLevel); // re-enable interrupts
}
void Lock::Release() {
ASSERT(isHeldByCurrentThread());
IntStatus oldLevel = interrupt->SetLevel(IntOff);
freeOrBusy = 'f';
currentHolder = NULL;
Thread *thread = (Thread *)queue->Remove(); // "queue" is the list of threads waiting
if (thread != NULL) // make thread ready
scheduler->ReadyToRun(thread);
(void) interrupt->SetLevel(oldLevel);
}
関連する問題
- 1. ロックの実装
- 2. セマフォ実装のプロデューサ - コンシューマ指向のスレッドプール
- 3. 実装でのセマフォとmutexの違いは何ですか?
- 4. カスタムトランザクションの実装 - スレッディングとロック
- 5. Direct3DのVertexBufferロック()と異なるD3DPOOLによって実装ロック解除()関数
- 6. カウントを行うためのセマフォの実装。現在実行中のインスタンスの数
- 7. firebaseデータのロックと解放の実装
- 8. jqueryなしでsignalRを実装する
- 9. サーバーファーム全体のロックを実装する方法は?
- 10. セマフォのロック/アンロックに影響するperror()呼び出しの問題
- 11. ファイルを使用した分散ロックの実装
- 12. RESTで粗いオプティミスティック・ロックをどのように実装しますか?
- 13. asp.netアプリケーションで「悲観的なロック」を実装するにはどうすればよいですか?
- 14. JBoss Weld:テスト用に異なる実装を実装する
- 15. Androidでシンプルなサービスを実装する
- 16. iOSでインタラクティブなpdfを実装する
- 17. 次のセマフォをリリースするまで、セマフォが解放されないようにする方法は?
- 18. インターフェイスを実装していないインターフェイスの実装
- 19. ウェイト/シグナル(セマフォ)実装の擬似コードはどのように「動作しますか」?
- 20. スコープ付きmutexロック用のカスタムRAII C++実装
- 21. ロックを解除しないでファイルをロックして削除する
- 22. IntegerPropertyがプロパティ<Number>を実装し、プロパティ<Integer>を実装しないのはなぜですか?
- 23. はDでクラスを実装し、C++でinstanciate/lifetimetrackを実装します
- 24. boost :: condition_variableロックなしで待機する
- 25. なぜライブラリはウィンドウに独自の基本ロックを実装していますか?
- 26. Android:PlayサービスなしでGoogleログインを実装する方法
- 27. iOS:UITabBarControllerなしでユーザーインターフェイスからUITabBarを実装する
- 28. ポルリングなしでアンドロイドモバイルデバイスにパブリッシュサブスクライブプッシュ通知を実装する方法
- 29. DelphiでXIRRの実装を実装するには?
- 30. セマフォに関する質問
割り込みを無効にできますか? – templatetypedef