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;
}
どちらの場合でも共通の機能を使って編集を投稿します –
投稿したトピックの回答を読んでいますが、とにかくセマフォを使用する必要があると思います...「クライアント」、コンピュータ "と"キュー "。任意のヒント ? – PlayHardGoPro
私はキューのキューデータ構造(これはもう少し複雑になります)、あるいは循環バッファを使用します。あなたが知っているなら、クライアントの最大数はバッファのためにすべて行く。クライアントを受け取っている間にキュー/バッファに配置し、コンピュータが解放されると次のクライアントをコンピュータに割り当てます。クライアントがsem_postを離れるときにセマフォを使用していて、ハンドラに各コンピュータのセマフォの値をチェックさせるようにするには、クライアントが> 0になると直ちにそれにクライアントを割り当てます。いくつかのコードを投稿すれば、もう少しお手伝いできます。私はちょうどあなたが開始しようとすることができるようにアイデアを与えています。 –