2015-04-29 6 views
0

Как использовать эти функции? Я объявил о блокировке по всему миру.Использование функций спин-блокировки

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. Но они не являются.

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

+2

Можете ли вы точно описать, какое поведение заставляет вас сказать, что он не работает? Вы получили сообщение об ошибке? Ваша программа зависает? Вызывает ли это неожиданный результат? – user2357112

+0

Мне очень жаль, я забыл цикл. Это просто не блокирует мое приложение. Семафоры работают как обаяние, но просто не эта спин-блокировка. –

+0

Что вы делаете? Просто используйте 'pthread_spin_lock' вместо этого цикла. Форма предварительного редактирования вашего кода была правильной. – user2357112

ответ

1

Для чего-либо, связанного с потоками POSIX для работы, вам необходимо использовать pthread_create(), чтобы начать новый поток. Здесь вы используете fork(), который запускает новый процесс, который не имеет того же адресного пространства, что и родительский.

+0

Критическая область - это фактически разделяемая память. –

+0

Является ли «блокировка» в общей памяти? –

+0

Нет, как мне его получить? –

0

Если вы хотите спинлок для использования нескольких процессов и не темы тогда сам спинлки также должны быть созданы в совместно используемой памяти процесса. Значение pshared PTHREAD_PROCESS_SHARED само по себе недостаточно для того, чтобы спин-блокировка была разделена между процессами.

Смежные вопросы