Моя программа имеет общую память, к которой любой доступ синхронизируется семафором semid .Он отлично работает среди процессов.Теперь я положил поток в одном процессе.В главном потоке (thread0
) он имеет цикл while(wait())
для постоянного доступа к общей памяти (wait()
- это функция для получения копии памяти с использованием semid
) и операции с дозами P
и V
семафор semid
.Теперь я получил "P operation on Semaphore failed."
, когда поток 1 пытался выполнить операцию P
.
основной поток:
...
while(1)
{
if ((RetVal = WAIT_MSG( p1, &Msg )) !=SUCC)
{
switch ( RetVal )
{
...
}
}
}
thread1:
...
send(src, dst, &msg, lenght);
/* both send and wait have an operation P and V on semid by calling the following */
DMINT tdm_sem_p( key_t semid )
{
struct sembuf sem_b;
sem_b.sem_num = 0;
sem_b.sem_op = -1;
sem_b.sem_flg = SEM_UNDO;
if (semop(semid, &sem_b, 1) == -1)
{
printf("thread %u: errno = %d\n", (unsigned int)pthread_self(),errno);
return S_PFAIL;
}
return SUCC;
}
DMINT tdm_sem_v( key_t semid )
{
struct sembuf sem_b;
sem_b.sem_num = 0;
sem_b.sem_op = 1;
sem_b.sem_flg = SEM_UNDO;
if (semop(semid, &sem_b, 1) == -1)
{
return S_VFAIL;
}
return SUCC;
}
/* semid is init by the following */
DMINT tdm_set_sem(key_t semid)
{
union semun sem_union;
sem_union.val = 1;
if (semctl(semid, 0, SETVAL, sem_union) == -1)
{
return FAILURE;
}
return SUCC;
}
--------------------------------------
Из GBD я получил:
(gdb) s
[Switching to Thread -1208808560 (LWP 3904)]
SEND_MSG (SrcModule=51, DstModule=99, msg_ptr=0xb7f2ff94, MsgLength=28)
at tdm_ipc.c:287
287 TDM_SEM_P( semid );
(gdb) s
[Switching to Thread -1208596800 (LWP 3899)]
tdm_sem_v (mid=RM) at tdm_ipc.c:595
595 sem_b.sem_num = 0;
(gdb) s
596 sem_b.sem_op = 1;
(gdb) s
597 sem_b.sem_flg = SEM_UNDO;
(gdb) s
599 if (semop(semid, &sem_b, 1) == -1)
(gdb) s
604 return SUCC;
(gdb) s
605 }
(gdb) s
RM:3899: V operation on Semaphore .
[Switching to Thread -1208808560 (LWP 3904)]
tdm_sem_p (mid=99) at tdm_ipc.c:578
578 sem_b.sem_num = 0;
(gdb) s
579 sem_b.sem_op = -1;
(gdb) s
580 sem_b.sem_flg = SEM_UNDO;
(gdb) s
582 if (semop(semid, &sem_b, 1) == -1)
(gdb) s
584 return S_PFAIL;
(gdb) s
588 }
(gdb) s
:0: P operation on Semaphore failed.
thread 3086489280: **errno = 4**
[Switching to Thread -1208596800 (LWP 3899)]
semop
Функция доза НЕ работает среди потоков в одном процессе?Если произойдет гонка, я ожидаю, что повесить трубку, чтобы ждать, кроме отказа.
Какая доза errno 4 имеет какой-либо смысл?Я смотрю на его значение.
Спасибо.