Можно ли из отдельного потока запустить функцию в главном потоке в 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 шт):
В 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 всё-таки есть то её выполняет.