расширение pthread-win32 sem_post_multiple - PullRequest
4 голосов
/ 03 декабря 2010

В настоящее время я создаю тонкую оболочку C ++ вокруг pthreads для внутреннего использования. Windows и QNX нацелены, и, к счастью, порты pthreads-win32, кажется, работают очень хорошо, в то время как QNX соответствует POSIX для наших практических целей.

Теперь при реализации семафоров я нажимаю на функцию

sem_post_multiple(sem_t*, int)

, который, очевидно, доступен только на pthreads-win32, но отсутствует в QNX. Как следует из названия, функция должна увеличивать семафор на число, указанное в качестве второго аргумента. Насколько я могу судить, функция не является частью ни POSIX 1b, ни POSIX 1c.

Несмотря на то, что в настоящее время нет никаких требований для указанной функции, я все еще задаюсь вопросом, почему pthreads-win32 предоставляет функцию и может ли она быть полезной. Я мог бы попытаться имитировать его для QNX, используя примерно следующее:

sem_post_multiple_qnx(sem_t* sem, int count)
{
   for(;count > 0; --count)
   {
       sem_post(sem);
   }
} 

То, что я прошу, это предложение / совет о том, как действовать. Если консенсус предлагает реализовать функцию для QNX, я также был бы признателен за комментарии о том, является ли предложенный фрагмент кода жизнеспособным решением.

Заранее спасибо.

PS: я специально упустил свой модный класс C ++ для ясности. Для всех людей, предлагающих помощь в спасении: это не вариант в моем текущем проекте по причинам управления.

Ответы [ 4 ]

1 голос
/ 03 декабря 2010

Предложенная вами реализация sem_post_multiple не очень хорошо работает с sem_getvalue, поскольку sem_post_multiple - это атомарное увеличение, и поэтому невозможно "одновременному" вызову sem_getvalue для возврата любого из промежуточных значений.

Лично я хотел бы пропустить их обоих: попытка добавить фундаментальные операции синхронизации в систему, в которой их нет, - это игра в кружку, и ваша обертка может вскоре перестать быть "тонкой".Так что не входите в это, если у вас нет кода, который использует sem_post_multiple, который вам абсолютно необходимо портировать.

1 голос
/ 03 декабря 2010

В любом случае семафоры являются дополнительным расширением в POSIX.Например, OS X, кажется, не реализует их полностью.Так что, если вы заинтересованы в переносимости, вам, во всяком случае, придется предоставить обертки необходимых вам функций.

Ваш подход к эмуляции атомарного приращения путем повторения sem_post, безусловно, имеет свои недостатки.

  • Возможно, он работает плохо, где обычно sem_t используется в критических контекстах производительности.
  • Эта операция не будет атомарной.Поэтому до того, как вы закончите цикл, могут произойти запутанные вещи.

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

0 голосов
/ 03 декабря 2010

Это интересный вопрос. +1.

Я согласен с существующим здесь консенсусом, что, вероятно, не очень хорошая идея реализовать эту функцию. Хотя предложенная реализация, вероятно, будет работать нормально в большинстве ситуаций, есть определенные условия, в которых результаты могут существенно отличаться из-за неатомности. Ниже приводится одна (чрезвычайно) надуманная ситуация:

  • Начать поток A, который вызывает sem_post_multiple (s, 10)
  • Поток B, ожидающий s, освобожден. Нить B убивает нить A.

В приведенном выше недружественном сценарии атомарная версия увеличила бы семафор на 10. В неатомарной версии она может быть увеличена только один раз. Этот пример, конечно, вряд ли в реальном мире. Например, уничтожение потока - почти всегда плохая идея, не говоря уже о том, что он может оставить объект семафора в недопустимом состоянии. Реализация Win32 может оставить блокировку мьютекса на семафоре - , почему это .

0 голосов
/ 03 декабря 2010

sem_post_multiple () - это нестандартная вспомогательная функция, представленная сопровождающими win32-pthreads.Ваша реализация отличается от их реализации, потому что множественные декременты не являются атомарными.Является ли это проблемой, зависит от предполагаемого использования.(Лично я не буду пытаться реализовать эту функцию, если / пока не возникнет необходимость.)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...