Utrzymuję bibliotekę, która ma funkcję, która wymaga zmiennych specyficznych dla wątku. Z powodu błędu w gcc 4.2, jeśli zdefiniuję static __thread in x; , gdy funkcja biblioteczna zostanie wywołana z nienazwanego interfejsu API z PERL, zawiesza się.Jak utworzyć specyficzne zmienne pthread bez __thread
Chciałbym zdefiniować zmienne lokalne wątku za pomocą pthread_key_create(), ale muszę to zrobić w bibliotece i nie otrzymuję żadnego specjalnego wywołania, gdy wątek jest tworzony.
Jak utworzyć zmienną lokalną wątku, tylko jeśli nie istnieje? Coś
pthread_key_t tlsKey = 0;
int x;
myfunc()
{
if (pthread_key_t == 0){
pthread_key_create(&tlsKey, NULL);
pthread_setspecific(tlsKey, &x);
}
int& myx = pthread_getspecific(tlskey);
if (myx == 0){
myx=1;
something_under_myx_lock();
myx = 0;
} else {
cout << "locked in thread\n";
}
}
Uwaga: Jeśli zastanawiasz się, powodem muszę zamek w wątku jest, aby ten sygnał funkcja bezpieczny, a także wątek bezpieczne.
Dlaczego "extern" C "'? – dbbd
Pytanie jest oznaczone jako "C++", więc zakładam, że pytający używa kompilatora C++. 'pthread_once' jest funkcją języka C i oczekuje, że funkcja zostanie przekazana jako wskaźnik do funkcji C. Funkcje C++ i C niekoniecznie mają tę samą konwencję wywoływania/ABI, więc 'extern" C "' jest technicznie konieczne. W niektórych kompilatorach/platformach można go pominąć. –