Вызовите функции, которые требуют основной поток из разных волокон - PullRequest
0 голосов
/ 14 октября 2018

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

Примеры:

Предположим, у меня естьбиблиотека волокон, которая создает «потоки» с контекстом set / get.Безопасно ли вызывать функции основного потока только из любого волокна, запущенного из основного потока ОС?

Я думаю, что это нормально, поскольку ОС не знает о моих волокнах, но я не уверен.Я бы протестировал это, но результаты не были бы окончательными, поскольку он мог бы работать, но полагаться на неопределенное поведение.

Редактировать: пометить этот вопрос C, так как контекст set / get является функциями C, хотя, как упоминалось в комментарияхЯ думаю, что это может относиться и к программам, написанным на других языках.

1 Ответ

0 голосов
/ 16 октября 2018

Да, вы можете вызывать любую функцию в вашей программе из любого контекста.Обратите внимание, что использование getcontext и setcontext не создает настоящих «потоков», и вы не получаете никакой параллельной обработки с этим - вы только получаете планирование.Вот почему это будет работать, независимо от того, является ли это пользовательским интерфейсом или нет.Это в основном просто goto, который работает кросс-функции.Чтобы процитировать manpage напрямую:

Если контекст был получен вызовом getcontext (), выполнение программы продолжается, как если бы этот вызов только что вернулся.

Это означает, что если я напишу

... code ... getcontext(&cxt); ... code ... setcontext(&cxt);

Затем, когда я достигну setcontext, состояние, к которому я иду, будет идентичным тому, когда функция getcontext только что вернулся.Нет заметной разницы (Конечно, вы могли изменить значения памяти в то же время, но это не относится к делу).Страница man имеет аналогичную гарантию с makecontext, но с учетом того, что она будет перенаправлять вас после завершения выполнения данной функции.

Примеры, которые вы приводите, находятся на языках программирования более высокого уровня, которые имеют гораздо большесложность, и, следовательно, не так просто, как setcontext / getcontext в C.Похоже, что опубликованная вами ошибка Java на самом деле является отдельным потоком ОС, как и в третьем примере.Первый пример выглядит так, как будто это может быть фиктивный поток, но, конечно, есть скрытые сложности, которые могут препятствовать работе вызовов пользовательского интерфейса (так как они взаимодействуют с внешними API).

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

Если вы знаете, что ваша волоконно-оптическая библиотека действительно использует только getcontext и setcontext, тогда вы 'все будет хорошо.Библиотека может делать что-то еще, поэтому в такой ситуации было бы неплохо проверить с авторами библиотеки.

...