Можно ли из отдельного потока запустить функцию в главном потоке в c/c++?

Не совсем понимаю как это сделать. Например в android в отдельном потоке можно запустить функцию runOnUIThread ( );. а в gtk, g_idle_add. то есть если мне нужно передать из сети какие то данные на виджет в gtk, то я использую g_idle_add, и он добавляет в основной цикл выполнение функции. что-то не пойму. я даже пример не смог написать нормальный. вот что написал. мне надо, чтобы из отдельного потока, выполнилась функция в главном потоке.

#include <stdio.h>
#include <pthread.h>

class Thread {
    public:
        pthread_t t1;
        Thread ( ) {
        }
        void run ( void *(*func) (void *data) ) {
            pthread_create ( &t1, NULL, func, this );
        }
        void runOnUI ( ) {
            printf ( "main thread\n" );
        }
};

static void *func ( void *data ) {
    Thread *it = ( Thread * ) data;

    it->runOnUI ( );

    return NULL;
}

int main ( int argc, char ** argv ) {
    Thread *t = new Thread ( );
    t->run ( func );
    pthread_join ( t->t1, NULL );
}

Ответы (1 шт):

Автор решения: AlexGlebe

В main нужно ждать сигнал, и после выполнять задачу. В плюсах std::thread https://en.cppreference.com/w/cpp/thread/condition_variable , в си pthread_t. https://computing.llnl.gov/tutorials/pthreads/#ConditionVariables

Вот пример с Си++ классами и с POSIX нитями.

/*

g++ -lpthread -Wall -Wextra -Wpedantic  waits.cpp -o waits

*/
#include <stdio.h>
#include <pthread.h>

pthread_mutex_t  lock ;
pthread_cond_t  cond ;

class Thread {
    public:
        pthread_t t1;
        int task  ;
        Thread ( ) { task = 0 ;
        }
        void run ( void *(*func) (void *data) ) {
            pthread_create ( &t1, NULL, func, this );
        }
        void runOnUI ( ) {
            printf ( "main thread\n" );
        }
};

static void *func ( void *data ) {
    Thread *it = ( Thread * ) data;
    
    pthread_mutex_lock(&lock);
    it->task = 1 ;
    pthread_cond_signal(&cond);
    pthread_mutex_unlock(&lock);
    
    return NULL;
}

int main ( int argc, char ** argv ) {
    pthread_cond_init(&cond,NULL);
    pthread_mutex_init(&lock,NULL);

    Thread *t = new Thread ( );
    
    t->run ( func );
    pthread_mutex_lock(&lock);
    while (t->task == 0) {
      pthread_cond_wait(&cond,&lock);
    }
    pthread_mutex_unlock(&lock);
    
    t->runOnUI ( );
    
    pthread_join ( t->t1, NULL );

    delete t ;
    
    pthread_mutex_destroy(&lock);
    pthread_cond_destroy(&cond);
}

Нить функцией func посылает сигнал с переменной, что задача №1 появилась. А функция main проверяет сигналы и если задача №1 всё-таки есть то её выполняет.

→ Ссылка