Я хочу создать в QNX параллельную объектно-ориентированную систему с использованием C++ и потоков. Как мне это сделать?
Я пытался:
pthread_t our_thread_id;
pthread_create(&our_thread_id, NULL, &functionA ,NULL);
где функция A является указателем на функцию:
void *functionA()
{ //do something
}
Однако эта функция работает только на C, а не на C++. Как заставить его работать на C++?





Короче говоря, вы передаете статическую функцию («батут») как указатель на функцию. Вы передаете "this" в качестве определяемого пользователем параметра. Затем статическая функция возвращает вызов реальному объекту.
Например:
class Thread {
public:
int Create()
{
return pthread_create(&m_id, NULL, start_routine_trampoline, this);
}
protected:
virtual void *start_routine() = 0;
private:
static void *start_routine_trampoline(void *p)
{
Thread *pThis = (Thread *)p;
return pThis->start_routine();
}
};
И вам необходимо убедиться, что функция C++ имеет то же соглашение о вызовах, что и pthread_create.
Я думаю, вам нужно объявить functionA как extern "C" (и дать ему правильную подпись, см. документация для pthreads в QNX). Эта функция принимает в качестве пользовательского параметра значение this:
extern "C"
{
void* DoSomethingInAThread(void* pGenericThis)
{
YourClass* pThis = reinterpret_cast<YourClass*>(pGenericThis);
pThis->DoSomethingInAThread();
}
}
int main()
{
YourClass* pSomeInstance = new YourClass();
pthread_t our_thread_id;
pthread_create(&our_thread_id, NULL, &DoSomethingInAThread, pSomeInstance);
}
Ваш functionA не является указателем на функцию, это функция, возвращающая void*. Также ожидается, что функция примет аргумент void *. Этот аргумент используется для передачи указателя на данные, необходимые в потоке.
Если вы замените
void* functionA() {
с участием
void functionA(void* threadData) {
Я ожидал, что он будет работать как на C, так и на C++.