Estou tentando escrever um código que não deveria ser executado simultaneamente nem por threads do mesmo processo, nem por processos diferentes. Em outras palavras, eu preciso que o mecanismo de sincronização global garanta exclusão mútua absoluta no GNU / Linux.
Quais estratégias eu tentei até agora:
std::mutex
, mutexes pthread, etc.). O problema é que essas primitivas fornecem sincronização apenas entre os threads dentro de um processo, não diferentes. lockf
, fcntl
). De acordo com o homem, eles fornecem bloqueio entre diferentes processos, mas os threads de um processo herdam o bloqueio e não podem ser sincronizados. De qualquer forma eu tentei, não me ajudou. sem_open
, sem_wait
, sem_post
), usando-os com o valor init 1 como exclusões mútuas. Parece sincronizado
ambos os casos com sucesso, mas o problema é - se o processo foi morto
enquanto segura o semáforo, o semáforo se torna ainda vivo
porque tem persistência no kernel. Como resultado, quando o processo é
reiniciar está esperando pelo sem sempre. F_OFD_SETLK
...) desde a minha última tentativa. Parece que eles poderiam me ajudar (eu não
entendê-lo completamente). Mas eles estão disponíveis desde o kernel
v.3.15, e eu preciso construir minhas fontes para o kernel v. 3.10. Então a questão é: que abordagem será relevante para essa tarefa? Devo continuar tentando combinar diferentes combinações primitivas diferentes ou usar qualquer outro - estou preso e não tenho idéias o que fazer a seguir.
P.S. A razão pela qual eu não postei nenhum exemplo de código - não faz sentido aqui (e também devido ao NDA). Em poucas palavras - é um bug (causando SIGSEGV) em um produto grande que inclui vários threads e processos, muitas vezes chamando alguns métodos de tempo de execução CUDA simultaneamente.
Sim, é absolutamente um problema relacionado ao CUDA - mas descobrimos que restringir a execução paralela pode ser uma solução temporária para isso. Como eu disse, o problema está em organizar exclusão mútua global e segura para encadeamentos e processos.
Tags process c c++ linux multithreading