Pregunta

Actualmente estoy construyendo una delgada C ++ envoltura alrededor de pthreads para su uso en la casa. Ventanas, así como QNX están dirigidos y afortunadamente los puertos pthreads-win32 parece que funciona muy bien, mientras que QNX es conforme a POSIX para nuestros propósitos prácticos.

Ahora, mientras se implementan los semáforos, que golpeó la función

sem_post_multiple(sem_t*, int)

que es aparentemente sólo está disponible en pthreads en Win32, pero no se encuentra en QNX. Como su nombre indica se supone que la función de incrementar el semáforo por el recuento dado como segundo argumento. Por lo que yo puedo decir que la función no es parte de ninguno de POSIX 1b 1c ni POSIX.

A pesar de que actualmente no existe ningún requisito para dicha función sigo preguntando por qué pthreads en Win32 proporciona la función y si podría ser de utilidad. Podría tratar de imitar por QNX utilizando similar al siguiente:

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

Lo que estoy pidiendo son sugerencia / consejo sobre cómo proceder. Si el consenso sugiere que hacer para implementar la función de QNX También agradecería comentarios sobre si el código cortó sugerida es una solución viable.

Gracias de antemano.

PD: deliberadamente dejó fuera mi fantasía clase de C ++ para una mayor claridad. Para todas las personas que sugieren impulso al rescate: no es una opción en mi proyecto actual, debido a razones de gestión

.
¿Fue útil?

Solución

En cualquier semáforos caso son una extensión opcional en POSIX. Por ejemplo OS X no parece que los apliquen plenamente. Así que si usted está preocupado con la portabilidad, que tendría que proporcionar las envolturas de las funcionalidades que necesita, de todos modos.

Su método para emular un incremento atómica por sem_post iterada tiene ciertamente desventajas.

  • Podría ser deficiente, una donde por lo general se utilizan en sem_t rendimiento contextos críticos.
  • Esta operación no sería atómico. Así las cosas podrían confundir suceder antes de que termine el bucle.

Me se pegaba a la justa necesaria, estrictamente conformes con POSIX. Tenga en cuenta que sem_timedwait es otra parte opcional de la opción de semáforos.

Otros consejos

Su aplicación propuesta de sem_post_multiple no juega bien con sem_getvalue, ya que se produce un aumento sem_post_multiple atómica y por lo tanto no es posible que una llamada "simultánea" a sem_getvalue a devolver cualquiera de los valores intermedios.

En lo personal me gustaría dejar a ambos: se trata de añadir las operaciones fundamentales de sincronización para un sistema que carece de ellos es un juego de tontos, y su envoltorio pronto podría dejar de ser "fina". Así que no entrar en ella a menos que tenga el código que utiliza sem_post_multiple, que usted no tiene absolutamente a puerto.

sem_post_multiple () es una función auxiliar no estándar introducido por los mantenedores de Win32-pthreads. Su aplicación no es la misma que la suya, porque los múltiples decrementos no son atómicos. Si es o no es un problema depende del uso previsto. (En lo personal, no me gustaría tratar de aplicar esta función a menos que / hasta que surja la necesidad.)

Esta es una pregunta interesante. 1.

Estoy de acuerdo con el consenso actual que prevalece aquí que probablemente no es una buena idea para poner en práctica esa función. Mientras que su implementación propuesta sería probablemente funcionan bien en la mayoría de las situaciones, sin duda hay condiciones en las que los resultados podrían ser dramáticamente diferente debido a la falta de atomicidad. La siguiente es una (muy) situación artificial:

  • Start hilo A que llama sem_post_multiple (s, 10)
  • se libera
  • Tema B espera en s. Hilo de rosca B mata A.

En el anterior escenario hostil, la versión atómica habría incrementado el semáforo por 10. Con la versión no atómica, lo que sólo podrá ser incrementado una vez. Este ejemplo es, sin duda no es probable que en el mundo real. Por ejemplo, el asesinato de un hilo es casi siempre una mala idea por no mencionar el hecho de que podría dejar el objeto de semáforo en un estado no válido. La aplicación Win32 puede dejar un bloqueo de exclusión mutua en el semáforo - ver esto por qué .

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top