Я вызываю 100 потоков, и каждый поток должен увеличивать общую переменную 1000 раз. Таким образом, ожидаемый результат должен быть равен 100 000. Конечно, когда несколько потоков пытаются увеличить одну общую переменную, вы также можете получить результаты, отличные от 100 000 (маловероятно, что вы сможете получить 100 000).
Чтобы справиться с этим, я заблокировал метод, который увеличивает переменную, чтобы все работало синхронно.
Тем не менее, я все еще получаю числа, такие как 99000, 98000, а иногда и 100000. Но это всегда должно быть 100000, потому что у меня есть блокировка, верно?
Это то, что у меня есть
volatile unsigned int count = 0;
void *increment(void *vargp);
pthread_mutex_t mutex = PTHREAD_MUTEX_INITIALIZER;
int main() {
fprintf(stdout, "Before: count = %d\n", count);
int j;
// run 10 times to test output
for (j = 0; j < 10; j++) {
// reset count every time
count = 0;
int i;
// create 100 theads
for (i = 0; i < 100; i++) {
pthread_t thread;
Pthread_create(&thread, NULL, increment, NULL);
}
fprintf(stdout, "After: count = %d\n", count);
}
return 0;
}
void *increment(void *vargp) {
int c;
// protected by mutex lock
pthread_mutex_lock(&mutex);
// increment count 1000 times
for (c = 0; c < 1000; c++) {
count++;
}
pthread_mutex_unlock(&mutex);
return NULL;
}