Я только начал узнавать о потоке сегодня и хотел проверить состояние гонки потоков, выполнив два кода с / без мьютекса.
#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