P семафор не удался - PullRequest
       9

P семафор не удался

0 голосов
/ 06 марта 2012

Моя программа имеет общую память, к которой любой доступ синхронизируется семафором 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 имеет какой-либо смысл?Я смотрю на его значение.

Спасибо.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...