سلام
لطفا طریقه ساخت یک semaphore را بگویید و هر خط آن را توضیح دهید که چه عملی انجام می دهد.
مرسی
Printable View
سلام
لطفا طریقه ساخت یک semaphore را بگویید و هر خط آن را توضیح دهید که چه عملی انجام می دهد.
مرسی
دوباره سلام.
در مورد Semaphore که صحبت کردیم. بهتر بود موضوع در Win32-Platform بود که واضح تر باشه.
با استفاده از تابع semget میتونید یک Semaphore ایجاد کنید.
مثلا :
الان ما یک Semaphore ایجاد کردیم البته به صورت private. میتونستیم یک ID مثلا 100 به این semaphoreکد:
int sem_1;
sem_1 = semget(IPC_PRIVATE,1,IPC_CREAT | 0600)
if ( sem_1 == -1 )
{
perror("Error!");
exit(1);
}
نسبت بدیم. (به جای IPC_PRIVATE )
خب بعد از ایجاد کردن این semaphore باید اونرو initialize کنیم. که این کار هم با استفاده از semctl میتونیم
انجام بدیم.
مثلا :
خب چون ما یک دونه semaphore داشتیم آرگومان دوم مقدارش میشه 0 (اولین semaphore)کد:
int res;
res = semctl(sem_1,0,SETVAL,3);
if ( res == -1 )
{
perror("Error!");
exit(1);
}
و با استفاده از آرگومان چهارم مقدار semaphore مون رو set میکنیم که در اینجا مقدارش رو برابر با 3 گذاشتم.
گرچه بهتره به جای عدد گذاری مستقیم از union semun استفاده میکردیم که در اینجا مهم نیست.
حالا میمونه استفاده از semaphore که باستفاده از semop و یک struct انجام میشه. با استفاده از این struct
مقدار semaphore رو زیاد یا کم میکنیم.
به این شکل :
با کد بالا مقدار semaphore رو یکی کم میکنیم. وقتی باید این کار رو انجام بدیم که مثلا process ما شروعکد:
struct sembuf sem_op;
sem_op.sem_num = 0;
sem_op.sem_op = -1;
sem_op.sem_flg = 0;
semop(sem_1,&sem_op,1);
به فعالیت میکنه و وقتی که کارش تموم شد از کد پایین استفاده میکنیم.
سعی کردم خلاصه و مفید توضیح بدم.کد:
struct sembuf sem_op;
sem_op.sem_num = 0;
sem_op.sem_op = 1;
sem_op.sem_flg = 0;
semop(sem_1,&sem_op,1);
اگه براتون مشکلی پیش اومد اطلاع بدید.