Нужен умный ответ для странной ошибки сегментации во встроенном ARM с потоками posix - PullRequest
1 голос
/ 18 октября 2010

Последние пару дней я работал над странной ошибкой сегментации.Следующий код отлично работает на моем ПК под управлением Linux.Но с использованием кросс-компилятора ARM, поставляемого производителем нашего встроенного устройства, он дает ошибку сегментации в подпрограмме s ().SIGSEGV происходит при уничтожении std :: string.Это также происходит, если вы передаете его как переменную.Однако с классами, отличными от STL (например, int), все работает нормально.

Код скомпилирован с использованием кросс-компилятора ARM


arm-linux-g++ -Wall -otest -lpthread
arm-linux-strip test

Все предложения приветствуются!


using namespace std;

void *ExecuteThreadMethod(void *AThread);

class Thread
{
  private:
    pthread_t internalThread;
    sem_t finishedSemaphore;
  public:
    bool Terminated;
    Thread()
    {
      Terminated = false;
      sem_init (&finishedSemaphore, 0, 0);
    }
    ~Thread()
    {
      sem_destroy (&finishedSemaphore);
    }

    void RunSigSegv() // <----- with the try...catch it causes a SIGSEGV in routine s() below
    {
      try
      {
        while (!Terminated)
        {
          cout << "ExecuteLooped" <&lt endl;
        }
        sem_post(&finishedSemaphore);
      }
      catch(...)
      {
      }
    }

    void RunOk() // <----- without the try...catch, it runs fine
    {
      while (!Terminated)
      {
        cout << "ExecuteLooped" << endl;
      }
      sem_post(&finishedSemaphore);
    }

    void Start()
    {
      pthread_attr_t _attr;

      pthread_attr_init(&_attr);
      pthread_attr_setdetachstate(&_attr, PTHREAD_CREATE_DETACHED);
      pthread_create (&internalThread, &_attr, ExecuteThreadMethod, this);
    }

    void Terminate()
    {
      Terminated = true;
      sem_wait(&finishedSemaphore);
    }
};

void *ExecuteThreadMethod(void *AThread)
{
  ((Thread *)AThread)->RunSigSegv();
  pthread_exit(NULL);
}

Thread _thread;

void s()
{
  string Test;
  _thread.Start();
} // <----- destruction of std::string Test causes a SIGSEGV, without try...catch in the thread this doesn't happen

void t()
{
  _thread.Terminate();
}

int main(void)
{
  s();
  t();
}

1 Ответ

0 голосов
/ 27 октября 2010

Не использовать -lpthread. Это просто ссылки на библиотеку, которая предоставляет функции обработки потоков. Для полной поддержки многопоточности может потребоваться нечто большее, например, связывание со специально поточно-ориентированной версией libstdc ++ или резервирование определенного регистра для доступа к локальной переменной потока.

В gcc или g ++ используйте флаг командной строки -pthread как для компиляции, так и для компоновки. Это даст команду gcc сделать все необходимое для обеспечения надежной многопоточности, включая, помимо прочего, добавление флага -lpthread при необходимости.

...