Тестирование состояния гонки - PullRequest
0 голосов
/ 21 декабря 2018

Я только начал узнавать о потоке сегодня и хотел проверить состояние гонки потоков, выполнив два кода с / без мьютекса.

#define HAVE_STRUCT_TIMESPEC
#include <pthread.h>
#include <stdio.h>
#include <windows.h>
#include <stdlib.h>

#define NTHREADS 3
#define ITERATIONS (long long) 1000000000

//pthread_mutex_t mutex;

static long long counter = 0;

static void * thread_f(void * arg) {
    unsigned long long i;
    (void)arg;

    for (i = 0; i != ITERATIONS; i++) {
    //  pthread_mutex_lock(&mutex);
    counter = counter + 1;
    //  pthread_mutex_unlock(&mutex);
    }
 return NULL;

}

int main(void) {
    pthread_t threads[NTHREADS];

    int i;

    for (i = 0; i != NTHREADS; i++)
        pthread_create(&threads[i], NULL, thread_f, NULL);

    for (i = 0; i != NTHREADS; i++)
        pthread_join(threads[i], NULL);


    printf("expected = %lld, actual = %lld\n", NTHREADS*ITERATIONS, counter);
    printf("experienced %lld race conditions\n", NTHREADS*ITERATIONS - counter);


    system("pause");
    return 0;
}

Итак, без мьютекса программа выводит следующие строкина cmd:

ожидаемое = 3000000000, фактическое = 1174158414
опытные условия гонки 1825841586

Однако, если я добавлю мьютекс в код и запустлю программу,cmd всплывает, затем выключается, не показывая никакого результата.

Я хочу знать, что я что-то не так запрограммировал или неправильно использую строки мьютекса, поскольку я действительно мало что знаю о потоках.

psэто закодировано в windows 10, используя visual studio

1 Ответ

0 голосов
/ 21 декабря 2018

Благодаря EOF из комментария я узнал, что не инициализировал мьютекс в коде.

Я просто добавил:

if (pthread_mutex_init(&mutex, NULL)) {
    printf("Something went wrong\n");
    return 1;
}

это в основном, и все работаетхорошо сейчас.

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