Как использовать эти функции? Я объявил о блокировке по всему миру.Использование функций спин-блокировки
pthread_spinlock_t lock;
Также спин-блокировка инициализируется локально.
pthread_spin_init(&lock, 1); // non-zero as pshared for IPC
Но теперь я хочу заблокировать свое критическое целое и увеличить его. Я несколько процессов, запущенных это в цикле:
while(0 != pthread_spin_trylock(&lock));
criticalInt += 1;
pthread_spin_unlock(&lock);
Почему не работает? Кроме того, как используется следующая функция?
pthread_spin_lock(&lock);
EDIT:
for (i=0; i < NUM_CHILDREN; i++) {
pid[i] = fork();
if (pid[i] == -1) { return EXIT_FAILURE; }
if (pid[i] == 0) {
while (criticalInt < MAXCOUNT) {
pthread_spin_lock(&lock);
criticalInt += 1;
pthread_spin_unlock(&lock);
count++;
}
printf("Process %i counted %i\n", i, count);
}
Для MAXCOUNT из шляпы производит 1000000 следующий вывод:
Process 3 counted 687858
Process 0 counted 815657
Process 1 counted 640191
Process 2 counted 744340
На самом деле все вместе были подведены итоги должны быть 1000000. Но они не являются.
Получаю аналогичные результаты, если полностью удалю блокировку.
Можете ли вы точно описать, какое поведение заставляет вас сказать, что он не работает? Вы получили сообщение об ошибке? Ваша программа зависает? Вызывает ли это неожиданный результат? – user2357112
Мне очень жаль, я забыл цикл. Это просто не блокирует мое приложение. Семафоры работают как обаяние, но просто не эта спин-блокировка. –
Что вы делаете? Просто используйте 'pthread_spin_lock' вместо этого цикла. Форма предварительного редактирования вашего кода была правильной. – user2357112