comol
Зарегистрирован: 22.02.2006 Сообщения: 5
|
Добавлено: Ср Фев 22 2006 02:11 Заголовок сообщения: Глюки семафоров? |
|
|
Подскажите, может у меня руки не оттуда растут?
Клиент и сервер обмениваются сообщениями(через разделяемую память). 2 Семафора для синхронизации(доступ к ресурсу и чтение, либо запись).
На сервере:
if (SemAccess->Decrement()<0) cout<<"bed\n";
if (SemRead->Decrement()<0) cout<<"bed\n";
strncpy(&c_Msg[0], &Msg[0], 50);//Msg - разделяемая память
cout<<c_Msg<<"\n";
if (SemRead->Increment()<0) cout<<"bed\n";
if (SemAccess->Increment()<0) cout<<"bed\n";
на клиенте, соответственно:
if (SemAccess->Increment()<0) cout<<"bed\n";
if (SemWrite->Increment()<0) cout<<"bed\n";
memset(Msg,'\0',50);
strncpy (&Msg[0], "qwertyuiopasdfghjklzxcvbnmqwertyuiopasdfghjklzxcv", 50);
if (SemAccess->Decrement()<0) cout<<"bed\n";
if (SemWrite->Decrement()<0) cout<<"bed\n";
,где:
static struct sembuf sem_lock[1] = {
0, 1, 0};
static struct sembuf sem_unlock[1] = {
0, -1, 0};
int CSemaphore::Decrement()
{
if (semop (Id, &sem_unlock[0], 1)<0) return -1;
return 1;
}
int CSemaphore::Increment()
{
if (semop (Id, &sem_lock[0], 1)<0) return -1;
return 1;
}
Вот это всё не работает...., если же на сервере сделать к примеру так:
if (SemAccess->Decrement()<0) cout<<"bed\n";
if (SemRead->Decrement()<0) cout<<"bed\n";
cin>>n;
if (SemRead->Increment()<0) cout<<"bed\n";
if (SemAccess->Increment()<0) cout<<"bed\n";
то всё прекрасно работает!!!! |
|