Intereting Posts
Переключить программирование на С Как установить пакеты C на windows Лучшая оптимизированная машиной полиномиальная минимаксная аппроксимация арктангенса на ? Сортировка строк в статическом массиве в зависимости от их длины? | неправильное распределение / доступ | Ошибка в многомерной программе массивов в C Инъекция N-зависимостей в C – лучше, чем линеарные массивы? Не нужно немедленно удалять законченный дочерний процесс, нужно стать зомби c запрещен разрешение на программирование shmat () Параллельные вычисления в R с функциями C-in-R с использованием пакета снегопада. Проблема: Mac показывает загрузочные колеса и почти зависает Ошибка libpng 1.5.10: указатель разыменования на неполный тип Почему 7% -5 дает 2, но -7% 5 дает -2? Разве это не должно быть -2 в обоих случаях? Как printf% c действительно работает на языке программирования C Каков максимальный размер статического массива, который может быть объявлен в GCC? как использовать verilog PLI для связи с c с помощью компилятора ncverilog Что делает этот вызов массива символов как функция?

Семафор P не прошел

Моя программа имеет общую память, к которой любой доступ синхронизируется с помощью semafore semid . Он отлично работает среди процессов. Теперь я помещаю нить в один процесс. В основном streamе ( thread0 ) у него есть цикл while(wait()) для постоянного доступа к общей памяти ( wait() – функция для получения копии памяти с использованием semid ) и доза P и V операции на semid . Теперь я получил "P operation on Semaphore failed." когда stream 1 попытался выполнить операцию P

основная тема:

 ... while(1) { if ((RetVal = WAIT_MSG( p1, &Msg )) !=SUCC) { switch ( RetVal ) { ... } } } в ... 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 функции semop НЕ работает между streamами в одном процессе? Если гонка случится, я ожидаю, что она будет ждать, кроме провала.

Какая доза errno 4 имеет какой-то смысл? Я смотрю на его смысл.

Благодарю.