/*
Вопрос по семафорам (SV) и нитям (POSIX) под FreeBSD:
Здравствуйте, подскажите, пожалуйста почему это программ зависает. Строки из за-за которой это происходит помечена ниже в функции main()
Эта программа виснет только под FreeBSD
*/
#include
#include
#include
#include
#include
#include
#include
int Exit=0;/* говорит потока, что нужно закругляться, изменяется в функции main */
int ReStart,Start;/* идентификаторы, которые возвращает semget() */
/*
Start управляет запуском потоков, инициализируется значанием EXETHREADS (количество одновременно запускаемых потоков)
ReStart количество потоков, которые стартовали и прошли одну итерация в hand()
*/
struct sembuf dec={0},inc={0},op={0};/* инициализируются в функции main() */
void*hand(void*p){
do{
semop(Start,&dec,1);
if(Exit)break;
puts(p);
semop(ReStart,&inc,1);
}while(1);
fprintf(stderr,"bye, %s!\n»,p);
return NULL;
}
#define MAXTHREADS 5
#define EXETHREADS 2 /* число одновременно запущенных потоков */
#define ITERAT 2 /* количество запусканий потоков */
int main(void){
char*s[MAXTHREADS]={«Mike»,«Leo»,«Don»,«Raph»,«Splinter»};
int i;
pthread_t thread[MAXTHREADS];
/* инициализирование операций над семафорами */
dec.sem_op=-1,inc.sem_op=1,op.sem_op=EXETHREADS;
if( -1==(Start=semget(’A',1,0666|IPC_CREAT)) ||
-1==(ReStart=semget(’B',1,0666|IPC_CREAT))
){perror(«semget»);return EXIT_FAILURE;}
/* начальное значение семафоров */
semctl(Start,0,SETVAL,0);
semctl(ReStart,0,SETVAL,0);
Последние комментарии
- OlegL, 17 декабря в 15:00 → Перекличка 21
- REDkiy, 8 июня 2023 года в 9:09 → Как «замокать» файл для юниттеста в Python? 2
- fhunter, 29 ноября 2022 года в 2:09 → Проблема с NO_PUBKEY: как получить GPG-ключ и добавить его в базу apt? 6
- Иванн, 9 апреля 2022 года в 8:31 → Ассоциация РАСПО провела первое учредительное собрание 1
- Kiri11.ADV1, 7 марта 2021 года в 12:01 → Логи catalina.out в TomCat 9 в формате JSON 1