pthread_join не работает и мьютекс не работает в C - PullRequest
1 голос
/ 27 января 2020

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

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

Первая версия кода вызвала проблему, из-за которой main иногда закрывалась до того, как потоки сделали свое дело, хотя Я использую соединения. Это код:

Обновление: использование pthread_join (& ....); не очень хорошая идея Я должен был использовать pthread_join (...); (без &) эта часть работает, как и сейчас.

#include <stdio.h>
#include <stdlib.h>
#include "wrapper.h"
#include <pthread.h>
#include <sys/time.h>

static pthread_mutex_t mutex = PTHREAD_MUTEX_INITIALIZER;


void *HelloMoon (void * arg){
    pthread_mutex_lock(&mutex);

    struct timeval stop, start;
    int i = 0;

    gettimeofday(&start, NULL);
        while(i < 3){
            gettimeofday(&stop, NULL);
            if((stop.tv_usec-start.tv_usec)>=20000){
                printf("Hello Moon!\n");
                gettimeofday(&start, NULL);
                i++;
            }
        }

    pthread_mutex_unlock(&mutex);

    return NULL;
}


void *printHelloWorld(void* arg){

    pthread_mutex_lock(&mutex);

    struct timeval stop, start;

    int i = 0;

    gettimeofday(&start, NULL);
    while(i < 3){
        gettimeofday(&stop, NULL);
        if((stop.tv_sec-start.tv_sec)>=1){
            printf("Hello world!\n");
            gettimeofday(&start, NULL);
            i++;
        }
    }

    pthread_mutex_unlock(&mutex);

    return(NULL);

}



int main(int ac, char * argv)
{

    pthread_t thread_id1, thread_id2;

    pthread_create(&thread_id2, NULL, HelloMoon, NULL);
    pthread_create(&thread_id1, NULL, printHelloWorld, NULL);

    pthread_join(&thread_id2, NULL);
    pthread_join(&thread_id1, NULL);


    return(0);
}

Этот второй код использует в основном время while l oop, чтобы поведение повторялось вечно. Это «решает» проблему основного выхода, но иногда один поток запускается дважды, заставляя его печатать 6 раз вместо трех. Это почему? Код:

Обновление: я думаю, это потому, что l oop создает два новых потока при каждом запуске, что делает общее количество потоков больше двух, и это, в свою очередь, имеет несколько потоков с одинаковым id приводит к этому забавному поведению. Я прав или нет?

int main(int ac, char * argv)
{

    pthread_t thread_id1, thread_id2;

    while(1==1){
        pthread_create(&thread_id2, NULL, HelloMoon, NULL);
        pthread_create(&thread_id1, NULL, printHelloWorld, NULL);

        pthread_join(&thread_id2, NULL);
        pthread_join(&thread_id1, NULL);
    }


    return(0);
}

Последние вопросы, каков наилучший способ заставить потоки работать один за другим вечно? В то время как l oop хорошая идея? Являются ли переменные "i" одинаковыми для потоков? Я думаю, что нет, но один источник сказал, что это так, поэтому я хочу быть уверен.

1 Ответ

2 голосов
/ 27 января 2020

pthread_join ожидает идентификатор потока вместо указателя на него в качестве первого параметра.

pthread_join(&thread_id2, NULL);
pthread_join(&thread_id1, NULL);

должно быть

pthread_join(thread_id2, NULL);
pthread_join(thread_id1, NULL);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...