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

Тема в разделе "Общие вопросы по С и С++", создана пользователем alien707, 19 авг 2014.

  1. alien707

    alien707 New Member

    Регистрация:
    19 авг 2014
    Сообщения:
    1
    Симпатии:
    0
    есть мастер тред и дополнительный тред (в дальнейшем их планируется сделать около 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 из набора

    почему оно может тормозиться?
    и как можно посмотреть что происходит?
     
Загрузка...
Похожие Темы - Блокируется Семафор
  1. Leon
    Ответов:
    4
    Просмотров:
    77

Поделиться этой страницей