2016-05-28 14 views
1

semaphoreを使用して、同期化されたスレッドで調査を開始します。
私はバイナリセマフォ(2つのスレッドのみ)を使ってテストを行いました。セマフォを使用するプロデューサ/コンシューマ

3台のコンピュータ(スレッド)といくつかのクライアント(スレッド)を持つlanhouseを想像してみてください。すべてのコンピュータが不安定な場合、クライアントは知られている限度(例えば15クライアント)でqueueで待機する。

どのようにスレッドが相互に関連するのか理解できません。

私が知る限り、semaphoreは、特定のクリティカル領域/メモリ領域/グローバル変数へのスレッドのアクセスを制御するために使用されます。

1)1つのセマフォを作成して、コンピュータにアクセスするクライアントを制御します(ただし両方ともスレッドです)。

2)クライアントを制御する1つのセマフォをqueueに作成します。

スレッドとスレッドとの関係はどのようになっていますか?セマフォがどのスレッドを処理すべきかをどのように知るか。

完全な回答は必要ありません。私はちょうどThreadsがお互いに関係する方法を理解する必要があります。いくつかの状況を理解するのに役立ちます。

これまでのコードですが、動作していません; Pは、3台のコンピュータにアクセスするクライアントを制御できません。

#include <pthread.h> 
#include <semaphore.h> 
#include <stdio.h> 
#include <stdlib.h> 
#include <unistd.h> 
#define ROOM_SIZE 15 

sem_t queue, pc, mutex; 
int room [ROOM_SIZE]; 
int pcsAvaliable = 3, nAvaliable = 0, roomAvaliable = ROOM_SIZE; 
int computers [3]; // 0 -> Empty | 1 -> Ocuppied 

void* Lan(void* arg) 
{ 
    //Enter the lanhouse 
    //Verify if there is a computer avaliable 
    sem_wait(&pc); 

    if(pcsAvaliable > 0) 
    { 
     sem_wait(&mutex); 
     pcsAvaliable--; 
     computers[nAvaliable] = 1;  
     printf("Cliente pegou pc: %d\n", nAvaliable); 
     nAvaliable++; 
     sem_post(&mutex); 

     //Wait for 80~90ms 
     printf("Client liberou pc: %d\n", nAvaliable); 
     computers[nAvaliable] = 0; 
     nAvaliable--; 

     sem_post(&pc); 
    } 
    else 
    { 
     printf("No computer avaliable...\n"); 
     //Check the waiting room for avaliable slot 
     if(roomAvaliable > 0) 
     { 
      roomAvaliable--; 
      printf("Client entered the waiting room."); 
     } 
     else 
      printf("No avaliable space in waiting room..\n"); 
    } 



} 

int main(int argc, char const *argv[]) 
{ 
    int i; 

    if(argc > 1) 
    { 
     int numClients = atoi(argv[1]); 
     sem_init(&pc, 0, 3); 
     sem_init(&mutex, 0, 1); 
     pthread_t clients[numClients]; 

     //Create Clients 
     for(i=0; i< numClients; i++) 
     { 
      pthread_create(&clients[i], NULL, Lan, NULL); 
     } 

     //Join Clients 
     for(i=0; i< numClients; i++) 
     { 
      pthread_join(clients[i], NULL); 
     } 

    } 
    else 
     printf("Please, insert a parameter."); 
    pthread_exit(NULL); 
    sem_destroy(&pc); 
    return 0; 
} 

答えて

1

あなたはあなたがセマフォを使用する必要があるスレッド間のタスクを同期している場合は、技術的なことするつもりなら。入力を解析してから解析する例 Here'sセマフォに関する回答。

共有リソースを使用していて、競合状態/ 2つのスレッドが同時にアクセスするのを避ける必要がある場合は、mutexを使用する必要があります。 Here'sは、ミューテックスとは何かに関する質問です。

また、disambiguationをマイケル・バー氏が見ていますが、これは本当に良いです。

私は徹底的に質問と曖昧さ回避の両方を読んでいます。共有リソースを制御していると説明したので、実際にはセマフォとミューテックスを使用しない可能性があります。

あなたは資源としてのコンピュータを扱うことができます(O.S.はあなたが上で実行しているかわからないのlinux用)

int sem_init(sem_t *sem, int pshared, unsigned int value); //Use pshared with 0, starts the semaphore with a given value 

int sem_wait(sem_t *sem);//decreases the value of a semaphore, if it's in 0 it waits until it's increased 

int sem_post(sem_t *sem);//increases the semaphore by 1 

int sem_getvalue(sem_t *sem, int *valp);// returns in valp the value of the semaphore the returned int is error control 

int sem_destroy(sem_t *sem);//destroys a semaphore created with sim_init 

共通ミューテックス機能

int pthread_mutex_init(pthread_mutex_t *p_mutex, const pthread_mutexattr_t *attr); //starts mutex pointed by p_mutex, use attr NULL for simple use 

int pthread_mutex_lock(pthread_mutex_t *p_mutex); //locks the mutex 

int pthread_mutex_unlock(pthread_mutex_t *p_mutex); //unlocks the mutex 

int pthread_mutex_destroy(pthread_mutex_t *p_mutex);//destroys the mutex 
+0

どちらの場合でも共通の機能を使って編集を投稿します –

+0

投稿したトピックの回答を読んでいますが、とにかくセマフォを使用する必要があると思います...「クライアント」、コンピュータ "と"キュー "。任意のヒント ? – PlayHardGoPro

+1

私はキューのキューデータ構造(これはもう少し複雑になります)、あるいは循環バッファを使用します。あなたが知っているなら、クライアントの最大数はバッファのためにすべて行く。クライアントを受け取っている間にキュー/バッファに配置し、コンピュータが解放されると次のクライアントをコンピュータに割り当てます。クライアントがsem_postを離れるときにセマフォを使用していて、ハンドラに各コンピュータのセマフォの値をチェックさせるようにするには、クライアントが> 0になると直ちにそれにクライアントを割り当てます。いくつかのコードを投稿すれば、もう少しお手伝いできます。私はちょうどあなたが開始しようとすることができるようにアイデアを与えています。 –

1

共通セマフォ機能。リソースのデータ構造は、メインスレッドによって初期化できます。次に、リソース(コンピュータ)のインスタンスを取得しようとするクライアントスレッドが存在する可能性があります。コンピュータ数に3の値を持つカウントセマフォを使用できます。コンピュータを取得するには、クライアントのスレッドがクライアントスレッドは、スレッドとセマフォの使用方法の詳細については

V (computer_sem) 

を行う必要があります解放する

同様
P (computer_sem). 

を行い、 POSIX Threads Synchronization in Cを参照してください。

+0

しかし、リソース(コンピュータ)は何でもかまいませんか? 3つの位置と0または1(bussyまたはavaliable)のベクトルのように? どのコンピュータがどのクライアントによって使用されたかをどのように「教えてくれるか」を理解できません。 – PlayHardGoPro

+0

カウントセマフォを使用する場合、リソースは同一であるとみなされます。リソースが異なる場合は、リソースごとに1つのセマフォを使用します。 – kjohri

+0

よろしく!私のコードで一見してください...ちょっとした指導。ときどき彼らはPC 0のみを使用し、時には0と1を使用することもありますが、入力する前に1を残します。その混乱 – PlayHardGoPro

関連する問題