2017-12-11 24 views
-1

良い午後。私はC言語のプログラミングを学び始めて、スキルをテストに合わせる面白い仕事を見つけました。正直言って、それは私を夢中にさせているし、私はそれを行う方法の手がかりを持っていない。セマフォを使用する代わりに、私はmutexを使いたいと思います。私は自動的にenter_tunnelを呼び出すプログラムを作成して、車が入るようにしました。北への運転(北=北==北)と南(=南=南)の2つの方向がありますが、あなたに向かって走っている車があれば、車がトンネルに入るのを止める方法を理解できません。私はそれを動作させるためにどのように情報を見つけようとしていましたが、このコンテキストでpthread_mutex_lock、pthread_mutex_unlock、pthread_mutex_signalを正しく使う方法がわかりません。トンネルタスクを解決するためにミューテックスを使用する

static int n_in_tunnel[2]; 
static unsigned long n_total[2]; 
static pthread_mutex_t tunnel_flow; 

void enter_tunnel(direction_t dir) { 
    int mutex = pthread_mutex_init(&tunnel_flow, NULL); 
    assert(mutex == 0); 

    n_in_tunnel[dir] += 1; 
    // assert(n_in_tunnel[opposite(dir)] == 0); 
} 

void exit_tunnel(direction_t dir) { 
    n_in_tunnel[dir] -= 1; 
    n_total[dir] += 1; 
} 
+1

あなたはあなたのアプリのデザインを説明していないので、何もお勧めできません。各車は独自のスレッドで管理されていますか? –

+0

「トンネル」は1車線だけなので、車はすべて同じ方向に向いている場合にのみ許可することができますか?そうであれば、現在トンネル内にある車の台数をカウントし、どの台車が何処に行くのかを知る必要があります。新しい車が同じ方向に進んでいる場合は、カウントを増やして車を入れてください。反対方向にトンネルに入ることを試みている車の数を追跡するコードはどうですか? I.アプリケーションにはさらに分析が必要で、保存されたデータは現状を表す必要があります。 – user3629249

答えて

0

例えば、問題の解決についての重要な文学、あります: https://docs.oracle.com/cd/E19683-01/806-6867/sync-12/index.html また、スタックオーバーフローで、それについての質問がすでにあります:Mutex example/tutorial? そして最後に、ここにあなたの問題が完全に解決されていますhttps://www.linkedin.com/pulse/semaphore-pthread-programming-linux-purvi-pathak?articleId=7625519368425966741 ここにコードをコピーすることができますが、私は彼の業績の解決策の著者を奪いたくありません。

関連する問題