我開始使用semaphore
與syncronzed線程進行學習。
我只是做了一個測試使用二進制信號量(僅2線程),它都很好。使用信號量的生產者/消費者
想象一下lanhouse,它有3臺計算機(線程)和一些客戶端(線程)。如果所有計算機都是bussy,那麼客戶端將在具有知識限制的queue
(例如15個客戶端)中等待。
我不明白線程將如何相互關聯。
據我所知,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,您就爲其分配一個客戶端。如果你發佈一些代碼,我可以幫助更多。我只是給出想法,以便你可以嘗試開始。 –