Empresas
Empregos
  • Sobre nós
  • Soluções
    • Publicação de vagas
      Publique sua vaga e receba candidatos qualificados em 48h.
    • Avaliações de candidatos
      Mais de 500 testes técnicos e psicológicos, mais anti-fraude.
    • Headhunting
      Busca executiva personalizada do início ao fim.
    • Folha de Pagamento + EOR
      Dispersão de folha e EOR em mais de 15 países da LATAM.
  • Preços
  • Empregos

0

724
Visualizações
Matrices C/C++ con subprocesos: ¿necesito usar mutexes o bloqueos?

Soy nuevo en el uso de subprocesos y he leído mucho sobre cómo se comparten y protegen los datos. Pero tampoco tengo una buena comprensión del uso de mutexes y bloqueos para proteger los datos.

A continuación se muestra una descripción del problema en el que trabajaré. Lo importante a tener en cuenta es que el tiempo será crítico, por lo que necesito reducir los gastos generales tanto como sea posible.

Tengo dos matrices dobles de tamaño fijo.

  • La primera matriz proporcionará datos para cálculos posteriores. Los subprocesos leerán valores de él, pero nunca se modificarán. Un elemento puede ser leído en algún momento por cualquiera de los hilos.

  • La segunda matriz se utilizará para almacenar los resultados de los cálculos realizados por los subprocesos. Un elemento de esta matriz solo será actualizado por un subproceso, y probablemente solo una vez cuando el valor del resultado
    está escrito en él.

Mis preguntas entonces:

  1. ¿Realmente necesito usar un mutex en un subproceso cada vez que accedo a los datos de la matriz de solo lectura? Si es así, ¿podría explicar por qué?

  2. ¿Necesito usar un mutex en un subproceso cuando escribe en la matriz de resultados aunque este sea el único subproceso que escribe en este elemento?

  3. ¿Debo usar tipos de datos atómicos y, si lo hago, habrá una sobrecarga de tiempo significativa?

  4. Muchas respuestas a este tipo de pregunta parecen ser: no, no necesita el mutex si sus variables están alineadas. ¿Estarían alineados los elementos de mi matriz en este ejemplo, o hay alguna forma de garantizar que lo estén?

El código se implementará en Linux de 64 bits. Estoy planeando usar bibliotecas Boost para subprocesos múltiples.

He estado reflexionando sobre esto y buscando en toda la web durante días, y una vez publicado, la respuesta y las explicaciones claras llegaron literalmente en segundos. Hay una "respuesta aceptada", pero todas las respuestas y comentarios fueron igualmente útiles.

over 4 years ago · Santiago Trujillo
3 Respostas
Responde à pergunta

0

  1. ¿Realmente necesito usar un mutex en un subproceso cada vez que accedo a los datos de la matriz de solo lectura? Si es así, ¿podría explicar por qué?

No. Debido a que los datos nunca se modifican, no puede haber un problema de sincronización.

  1. ¿Necesito usar un mutex en un subproceso cuando escribe en la matriz de resultados aunque este sea el único subproceso que escribe en este elemento?

Depende

  1. Si algún otro subproceso va a leer el elemento, necesita sincronización.
  2. Si algún hilo puede modificar el tamaño del vector, necesita sincronización.

En cualquier caso, tenga cuidado de no escribir mucho en ubicaciones de memoria adyacentes por diferentes subprocesos. Eso podría arruinar el rendimiento. Ver "uso compartido falso". Teniendo en cuenta que probablemente no tenga muchos núcleos y, por lo tanto, no muchos subprocesos y diga que la escritura se realiza solo una vez, probablemente esto no sea un problema importante.

  1. ¿Debo usar tipos de datos atómicos y habrá algún tiempo adicional significativo si lo hago?

Si usa bloqueos (mutex), las variables atómicas no son necesarias (y tienen sobrecarga). Si no necesita sincronización, las variables atómicas no son necesarias. Si necesita sincronización, se pueden usar variables atómicas para evitar bloqueos en algunos casos. En qué casos puede usar atómicos en lugar de bloqueos ... es más complicado y creo que está más allá del alcance de esta pregunta.

Dada la descripción de su situación en los comentarios, parece que no se requiere sincronización en absoluto y, por lo tanto, no hay atómicos ni bloqueos.

  1. ... ¿Estarían alineados los elementos de mi matriz en este ejemplo, o hay alguna forma de garantizar que lo estén?

Como señaló Arvid, puede solicitar una alineación específica utilizando la palabra clave alginas que se introdujo en c++11. Pre c++11, puede recurrir a extensiones específicas del compilador: https://gcc.gnu.org/onlinedocs/gcc-5.1.0/gcc/Variable-Attributes.html

over 4 years ago · Santiago Trujillo Relatório

0

Bajo las dos condiciones dadas, no hay necesidad de mutexes. Recuerde que cada uso de un mutex (o cualquier construcción de sincronización) es una sobrecarga de rendimiento. Por lo tanto, desea evitarlos tanto como sea posible (sin comprometer el código correcto, por supuesto).

  1. No. No se necesitan exclusiones mutuas ya que los subprocesos solo leen la matriz.

  2. No. Dado que cada subproceso solo escribe en una ubicación de memoria distinta, no es posible ninguna condición de carrera.

  3. No. No hay necesidad de acceso atómico a los objetos aquí. De hecho, el uso de objetos atómicos podría afectar negativamente el rendimiento, ya que impide las posibilidades de optimización, como las operaciones de reordenación.

over 4 years ago · Santiago Trujillo Relatório

0

La única vez que necesita usar bloqueos es cuando se modifican los datos en un recurso compartido. Por ejemplo, si algunos subprocesos se usaron para escribir datos y algunos se usaron para leer datos (en ambos casos del mismo recurso), entonces solo necesita un bloqueo para cuando finalice la escritura. Esto es para evitar lo que se conoce como "carrera".

Hay buena información de carrera en google para cuando haces programas que manipulan datos en un recurso compartido.

over 4 years ago · Santiago Trujillo Relatório
Responde à pergunta
Encontrar trabalhos remotos

Descubra a nova forma de encontrar um emprego!

melhores empregos
Principais categorias de trabalho
Empresas
Postar vaga Preços Comercial
Jurídico
Termos e Condições Política de privacidade
© 2026 PeakU Inc. All Rights Reserved.
Andres GPT
Recomende algumas ofertas para mim
Preciso de ajuda