Если вы хотите, чтобы функция выполнялась в главном потоке, вам нужно будет внедрить некоторый тип системы передачи сообщений.Так, например, вы запускаете свой основной поток, а затем запускаете рабочий поток.Рабочий поток будет выполнять свою работу, в то время как основной поток будет ожидать некоторого возвращаемого значения из рабочего потока (то есть основной поток будет проверять очередь сообщений или что-то в этом роде).Когда рабочий поток завершает свою работу, он передает в очередь сообщений основного потока структуру (т. Е. Сообщение) с указателем на функцию, которую он хочет запустить в основном потоке.Ваши сообщения могут быть довольно простыми:
struct message
{
typedef void (*func_ptr)(void); //or whatever your function signature would be
func_ptr function;
bool finished;
message(): function(NULL), finished(false) {}
};
Поэтому, когда рабочий поток завершит свою работу, он создаст новое сообщение, инициализирует указатель функции в сообщении и отправит это сообщение обратно в очередь, в которой находится основнойпоток ожидает.Затем основной поток читает сообщение из очереди и вызывает функцию.
Кстати, и эффективный способ заставить главный поток "ждать", не поддерживая его в цикле и не задействуя циклы ЦП, будетиспользовать семафор или переменную условия (например, boost::condition
) между основным потоком и рабочим.
И еще одно замечание ... «очередь сообщений» - это просто std::queue<message>
с соответствующим доступом к блокировке, который читает основной поток, а рабочий поток пишет.Также может быть другая очередь сообщений для рабочего потока, в которую записывает основной поток, и рабочий поток читает, если вам нужна двусторонняя связь между потоками.