valgrind --tool=helgrind pthread_spin_lock trouble (юзаю сабж, валгринд ругается, почему не пойму)

Модератор: Модераторы разделов

kozyavka
Сообщения: 1
ОС: suse

valgrind --tool=helgrind pthread_spin_lock trouble

Сообщение kozyavka »

Привет. Соб-но, вот не очень напряжный код :

Код:

#include <iostream> #include <stdio.h> #include <pthread.h> #include <assert.h> #include <sys/time.h> pthread_spinlock_t spin; int value; void setValue(int set_value) { assert(!pthread_spin_lock(&spin)); value = set_value; assert(!pthread_spin_unlock(&spin)); } int getValue() { int cur_value; assert(!pthread_spin_lock(&spin)); cur_value = value; assert(!pthread_spin_unlock(&spin)); return cur_value; } void * preved1(void *arg) { while (1) { setValue(12); sleep(1); } } void * preved2(void *arg) { while (1) { printf("%d\n", getValue()); sleep(1); } } int main() { assert(!pthread_spin_init(&spin, PTHREAD_PROCESS_PRIVATE)); pthread_t thread1, thread2; pthread_create(&thread1, NULL, preved1, NULL); pthread_create(&thread2, NULL, preved2, NULL); while(1); // pthread_spin_destroy(&spin); return 0; }


На этот безобидный код хелгринд показывает следующую ошибку :

Код:

==620== Thread #2 was created ==620== at 0x420C018: clone (in /lib/libc-2.6.1.so) ==620== by 0x4133871: pthread_create@@GLIBC_2.1 (in /lib/libpthread-2.6.1.so) ==620== by 0x4025963: pthread_create@* (hg_intercepts.c:213) ==620== by 0x8048827: main (main.cpp:58) ==620== ==620== Thread #3 was created ==620== at 0x420C018: clone (in /lib/libc-2.6.1.so) ==620== by 0x4133871: pthread_create@@GLIBC_2.1 (in /lib/libpthread-2.6.1.so) ==620== by 0x4025963: pthread_create@* (hg_intercepts.c:213) ==620== by 0x804884A: main (main.cpp:59) ==620== ==620== Possible data race during write of size 4 at 0x804A044 ==620== at 0x4137EA4: pthread_spin_init (in /lib/libpthread-2.6.1.so) ==620== by 0x80488DA: preved2(void*) (main.cpp:43) ==620== by 0x4025A4E: mythread_wrapper (hg_intercepts.c:193) ==620== by 0x4133191: start_thread (in /lib/libpthread-2.6.1.so) ==620== by 0x420C02D: clone (in /lib/libc-2.6.1.so) ==620== Old state: shared-modified by threads #2, #3 ==620== New state: shared-modified by threads #2, #3 ==620== Reason: this thread, #3, holds no consistent locks ==620== Location 0x804A044 has never been protected by any lock


Собственно, не пойму ваще ничо. До этого по сихре работал только с мютексами, там всё ок. А здесь - вроди ошибатся особо негде, но хелгринд говорит иначе. Причом ругается как то странно -
at 0x4137EA4: pthread_spin_init (in /lib/libpthread-2.6.1.so) - типа где то в этой фанке я несинхронно чото пишу, но какого хрена эта фанка ваще делает в потоке, старт функция которого preved2 ? Ведь pthread_spin_init я запускаю в самом начале в главном контексте.
Пробовал гуглить, смотрел как юзают этот механизм в библиотеке glibc, ответа не нашёл. :crazy:
За любые наводки буду благодарен ;)
Спасибо сказали: