Как сигнализировать, чтобы выбор () сразу возвратился?

Эти флаги - битмаски . Я писал об этом однажды давным-давно здесь, на SO .

Итак, в основном, чтобы использовать более одного варианта, вам нужно или их вместе

json_encode($array, JSON_PRETTY_PRINT | JSON_UNESCAPED_UNICODE);

26
задан Reunanen 21 December 2008 в 22:23
поделиться

2 ответа

Вы почти там. Используйте прием "самоканала" . Откройте канал, добавьте его к Вашему select() чтение и запись fd_set, запишите в него от основного потока для разблокирования рабочего потока. Это портативно через системы POSIX.

я видел вариант подобной техники для Windows в одной системе (на самом деле используемый вместе с методом выше, разделенный #ifdef WIN32). Разблокирование может быть достигнуто путем добавления, что макет (развязал) сокет дейтаграммы к fd_set и затем закрыв его. Оборотная сторона - то, что, конечно, необходимо вновь открыть его каждый раз.

Однако в вышеупомянутой системе, оба из этих методов используются скорее экономно, и для неожиданных событий (например, сигналы, запросы завершения). Предпочтительный метод является все еще переменным тайм-аутом к select(), в зависимости от того, как скоро что-то планируется для рабочего потока.

31
ответ дан Alex B 25 September 2019 в 07:46
поделиться

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

Используя сокет UDP определенно создает потенциал для случайных пакетов, чтобы войти и вмешаться.

неименованный канал никогда не будет доступен никакому другому процессу (если Вы не дадите его ему).

Вы могли также использовать сигналы, но в многопоточной программе Вы захотите удостовериться, что все потоки за исключением того, который Вы хотите, имеют тот замаскированный сигнал.

2
ответ дан MarkR 25 September 2019 в 07:46
поделиться
Другие вопросы по тегам:

Похожие вопросы: