Я искал решение в течение многих часов, но не могу найти простой ответ.Я получил класс, который использует pthreads.Фактический указатель на функцию является статическим внутри класса, и мне нужно заблокировать мьютекс, потому что до сих пор я получаю «странные» результаты (параметры не передаются правильно).
Однако pthread_mutex_lock и unlock не будут работатьвнутри функции, данной потоку, потому что она находится в статической функции-члене, но я не могу иметь функцию нестатической, потому что она не будет работать внутри класса, и я не могу переместить ее за пределы класса, потому что она не будетвозможность доступа к необходимой информации.
Следующий код должен объяснить:
class Fight{
pthread_mutex_t thread_mutex;
static void *thread_run_fighter(void *temp);
public:
Fight();
bool thread_round(Individual &a, int a_u, Individual &b, int b_u);
std::vector<Individual> tournament();
};
И файл cpp:
Fight::Fight(){
thread_mutex = PTHREAD_MUTEX_INITIALIZER;
}
bool Fight::thread_round(Individual &a, int a_u, Individual &b, int b_u){
if (a.saved and b.saved){
a.uniform = a_u;
b.uniform = b_u;
Individual *one = &a;
Individual *two = &b;
pthread_t a_thread, b_thread;
int a_thread_id, b_thread_id;
a_thread_id = pthread_create(&a_thread,NULL,Fight::thread_run_fighter,(void*) one);
b_thread_id = pthread_create(&b_thread,NULL,Fight::thread_run_fighter,(void*) two);
pthread_join( a_thread, NULL);
pthread_join( b_thread, NULL);
return true;
}
else{
return false;
}
}
void *Fight::thread_run_fighter(void *temp){
Individual *indiv;
indiv = (class Individual*)temp;
pthread_mutex_lock( &thread_mutex );
indiv->execute(indiv->uniform);
pthread_mutex_unlock( &thread_mutex );
}
Буду очень признателен, если кто-нибудь сможет пролитьнемного света в этом.Я застрял на несколько часов, и я не мог найти никакой информации вообще.Спасибо!