Я хочу написать простую программу на C, чтобы лучше понимать семафоры. Есть два потока, и они оба вызывают одну и ту же функцию. Первый увеличивает глобальную переменную, а второй поток уменьшает глобальную переменную.
Я пытаюсь заблокировать использование функции вторым потоком до того, как первый поток завершит свою работу. Но я все еще получаю неправильный ответ: -2000. Похоже, что оба потока имеют смещение -1. Как я могу это исправить, чтобы вывод всегда был 0? Я думал, что sem_wait внутри функции должен блокировать второй поток, пока не закончится первый. Следовательно, смещение должно было остаться 1.
#include <stdio.h>
#include <pthread.h>
#include <semaphore.h>
#define NUM_LOOPS 1000
long long counter = 0;
sem_t sem;
sem_t sem1;
void* counting_thread(void* arg) {
sem_wait(&sem);
int offset = *(int*) arg;
int i;
for(i = 0; i < NUM_LOOPS; i++){
//sem_wait(&sem);
counter += offset;
printf("offset = %d\n", offset1);
//sem_post(&sem);
}
sem_post(&sem);
pthread_exit(NULL);
}
int main() {
sem_init(&sem, 0, 1);
pthread_t th1;
int offset = 1;
pthread_create(&th1, NULL, &counting_thread, &offset);
//sem_post(&sem1);
pthread_t th2;
offset = -1;
pthread_create(&th2, NULL, &counting_thread, &offset);
pthread_join(th1, NULL);
pthread_join(th2, NULL);
printf("Finnal counter value: %lld\n", counter);
sem_destroy(&sem);
return 0;
}