2015-02-10 2 views
1

Я ищу способ реализовать функциональный эквивалент invokeOnMainThread (C# xamarin)/runOnUiThread (android)/выполнитьSelectorOnMainThread: (цель C) в C/C++ на linux.Как реализовать функцию типа invokeOnMainThread() в C/C++ linux?

По существу, мне нужна функция, которая может быть вызвана из любого потока, к которому я передаю обработчик, который выполняется в основном потоке.

Я считаю, что это будет полезно в тех случаях, когда я хочу ограничить доступ к определенному ресурсу конкретному потоку (например, доступ к libmysql DB к основному потоку).

Что было бы изящным способом реализовать это? Как это делается в Android?

+1

В C++, как о [контейнер] (http://en.cppreference.com/ w/cpp/container) с [функциями] (http://en.cppreference.com/w/cpp/utility/functional/function), которые только что вызвал нужный поток? В C легко реализовать что-то подобное с простым связанным списком и указателями функций. –

+2

Требование Thjis требует какой-то сигнализации другим потокам - что-то, что «основной поток» часто ждет для ввода сообщений/объектов/указателей функций/lambadas/безотносительно. Если «основной поток» реализует какой-то цикл обработки сообщений (как во многих системах GUI), вы можете это сделать. Если нет, вы не можете, потому что «нормальный» механизм вызова/возврата функции на основе стека не может изменить контекст потока. –

+1

В дополнение к тому, что указано выше, какова ваша «основная тема»? Используете ли вы какую-то структуру приложения? Если вы просто ищете возможность очереди обработчиков для выполнения в определенном потоке, то одним почти готовым способом будет использование C++ Boost.ASIO для создания пула потоков только с одним потоком. Затем вы можете отправить обработчики на него по мере необходимости, и все они будут выполнены на нужном потоке. –

ответ

1

Прямо, чтобы ваши обработчики места runOnMainThread в thread-safe queue для последующего исполнения по основной теме. Ваш основной поток должен быть готов периодически выполнять обработчики, которые он находит в этой очереди. Это означает, что основной поток должен включать цикл, который периодически проверяет наличие новых обработчиков в очереди. Эта периодическая проверка может быть эффективной с использованием semaphores или других потокобезопасных сигнальных механизмов.

Вот некоторые SO вопросы о потокобезопасных очередях:

Смежные вопросы