приостановить поток в c - PullRequest
0 голосов
/ 07 мая 2018

Я пишу программу на C, где мне нужно многопоточность (pthread). Поток создается несколько раз, скажем, 5. Я использую ncurses (вид графических окон в терминале), где я добавил несколько кнопок, и я хочу нажать на кнопку, чтобы приостановить поток, и нажать еще раз, чтобы возобновить его.

Эти потоки работают вместе и связаны с другим потоком, который блокирует эти потоки до тех пор, пока не будет выполнено допустимое условие, а затем позволит им продолжать работать (для этого я использую условные переменные и мьютекс).

Я заблокирован тем, как можно приостановить один поток. Я думал о создании условной переменной, но если я делаю это, мне нужна условная переменная для каждого потока. Я нашел функцию с именем pthread_kill, но она не работает и останавливает всю программу.

У многих людей такая же проблема, есть ли способ сделать это, используя сигналы? Я не знаю, полезен ли код, потому что мне нужна идея, но я все равно ее формулирую.

Это функция потока, которая будет повторяться 5 раз

void* update(void* arg)
{
int statut;

threadUpdate tu;

tu = *(threadUpdate*)arg;

while(1)
{

    statut = pthread_mutex_lock(&mutex);
    if(statut!=0)
    {
        fprintf(stderr, "Erreur lock mutex\n");
    }       

    scene_update2(tu.scene, tu.i);
    /*scene_update(tu.scene);*/

    *(tu.traitementTermine)=*(tu.traitementTermine)+1;

    if(*(tu.traitementTermine)==*(tu.nbObjets))
    {
        statut = pthread_cond_signal(&cond1);
        if(statut!=0)
        {
            fprintf(stderr, "Erreur cond signal\n");
        }
    }

    statut = pthread_cond_wait(&cond2,&mutex);
    if(statut!=0)
    {
        fprintf(stderr, "Erreur cond wait\n");

    }

    statut = pthread_mutex_unlock(&mutex);
    if(statut!=0)
    {
        fprintf(stderr, "Erreur unlock mutex\n");
    }   
}


return NULL;}

Поток, который будет создан один раз, просто содержит мьютекс для управления условной переменной с другими потоками. Это работает, и у меня нет проблем с этим.

1 Ответ

0 голосов
/ 08 мая 2018

Проверить семафоры . Вы должны быть в состоянии получить систему сигнализации с семафорами для каждого из ваших потоков и переменных, с которыми они работают.

...