¿Qué causa el mensaje de error de tiempo de ejecución: std::system_error – operación no permitida, incluidos los subprocesos múltiples? [duplicate]

2 minutos de lectura

avatar de usuario
Consultor independiente

Actualización en 2022

C ++ 17 y 20 ahora tienen soporte integrado para subprocesos múltiples en la biblioteca estándar. Sugeriría usar estos en lugar de usar la biblioteca pthread específica de Linux.

Pregunta inicial

Escribí un programa para probar hilos en kubuntu linux de 64 bits, versión 13.04. En realidad le robé el código a otra persona que estaba escribiendo un programa de prueba.

#include <cstdlib>
#include <iostream>
#include <thread>

void task1(const std::string msg)
{
    std::cout << "task1 says: " << msg << std::endl;
}

int main(int argc, char **argv)
{
    std::thread t1(task1, "Hello");
    t1.join();

    return EXIT_SUCCESS;
}

Compilé usando:

g++ -pthread -std=c++11 -c main.cpp
g++ main.o -o main.out

Luego corrió:

./main.out

Aparte, cuando I’ls -l’, main.out aparece en texto verde como todos los ejecutables, pero también tiene un asterisco al final de su nombre. ¿Por qué es esto?

Volviendo al problema en cuestión: cuando ejecuté main.out, apareció un error que decía:

terminate called after throwing an instance of 'std::system_error'
  what():  Operation not permitted
Aborted (core dumped)

¿Alguien tiene alguna idea sobre cómo solucionar esto?

  • Esta pregunta no debe marcarse como duplicada. Hay otras situaciones en las que puede obtener este mensaje de error. No se limita a enhebrar el problema de vinculación.

    – Kemin Zhou

    31 ago a las 18:39

avatar de usuario
factura

No está vinculando pthread correctamente, pruebe el siguiente comando (nota: el orden es importante)

g++  main.cpp -o main.out -pthread -std=c++11

O

Hazlo con dos comandos

g++ -c main.cpp -pthread -std=c++11         // generate target object file
g++ main.o -o main.out -pthread -std=c++11  // link to target binary

  • Puedes hacerlo con dos comandos. pero debes especificar -pthread tanto cuando compilas como cuando vinculas.

    –David Schwartz

    24 de junio de 2013 a las 11:14

  • Bien, gracias chicos, ¡ahora funciona!

    – Consultor independiente

    24 de junio de 2013 a las 11:16

  • @billz ¿Le importaría explicar por qué es importante el orden de -pthread?

    – hetepeperfan

    24 de junio de 2013 a las 11:45


  • primero debe compilarlo antes de vincularlo. poner -pthread int, el final del comando g ++ permitirá que g ++ lo vincule correctamente después de compilarlo en el archivo .o

    – billz

    24 de junio de 2013 a las 11:45


  • La entrada manual de GCC para -pthread dice específicamente “Esta opción establece indicadores tanto para el preprocesador como para el enlazador”. Debe usarlo al compilar y vincular.

    –Jonathan Wakely

    1 de diciembre de 2013 a las 23:13

¿Ha sido útil esta solución?