Код:
#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, ответа не нашёл.
За любые наводки буду благодарен