Блокируется Семафор

alien707

New member
19.08.2014
1
0
#1
есть мастер тред и дополнительный тред (в дальнейшем их планируется сделать около 4)
в каждом находится бесконечный цикл их работа должна быть синхронизирована.

мастер тред
config.players_num равно количеству вспомогательных тредов
сдесь 1
config.sem.send набор из 3 семафоров
C++:
while(1){	
printf("set 1 %d\n",config.players_num);
sem.sem_num=1;
sem.sem_op=config.players_num;
semop(config.sem.send,&sem,1);
//set 2
printf("set 2\n");
sem.sem_num=2;
sem.sem_op=1;
semop(config.sem.send,&sem,1);
//drop 0
printf("drop 0\n");
sem.sem_num=0;
sem.sem_op=-1;
semop(config.sem.send,&sem,1);

syncTPS();
if(config.players_num==0)
break;
//check 1
printf("check 1\n");
sem.sem_num=1;
sem.sem_op=0;
semop(config.sem.send,&sem,1);
//set 0
printf("set 0\n");
sem.sem_num=0;
sem.sem_op=1;
semop(config.sem.send,&sem,1);
//drop 2
printf("drop 2\n");
sem.sem_num=2;
sem.sem_op=-1;
semop(config.sem.send,&sem,1);
}
вспомогательные треды

C++:
#define semOp(x) semop(config.sem.send,&sem[x],1)

struct sembuf sem[3]={{0,0,0},
{1,-1,0},
{2,0,0}};
while(config.game!=0){
printf("w check 0\n");
semOp(0);
//	printf("sock %d\n",data->sock);
if (forEachNpc((gnode*)&data->sock,tickSendNpc)<0)
break;
if(forEachTower((gnode*)&data->sock,tickSendTower)<0)
break;
if(forEachBullet((gnode*)&data->sock,tickSendBullet)<0)
break;
printf("w drop 1\n");
semOp(1);
printf("w check 2\n");
sleep(0);
semOp(2);
}
до остановки выводится вот это
C++:
drop 0
check 1
w drop 1
w check 2
set 0
drop 2
set 1 1
w check 0
set 2
drop 0
w drop 1
check 1
w check 2
set 0
drop 2
set 1 1
set 2
drop 0
check 1
как я понял вспомогательный тред тормозится на семафоре 2 из набора

почему оно может тормозиться?
и как можно посмотреть что происходит?