nixp.ru v3.0

17 октября 2017,
вторник,
09:06:43 MSK

DevOps с компанией «Флант»
Fatal написал 26 ноября 2004 года в 21:45 (521 просмотр) Ведет себя как мужчина; открыл 123 темы в форуме, оставил 484 комментария на сайте.

/*

Вопрос по семафорам (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);