Почему pthread_getname_np () терпит неудачу в потоке в Linux?

0

Это фрагмент кода. Я могу задать имя потока. Тем не менее, я получаю сообщение об ошибке при получении имени потока. Пожалуйста помоги.

void *Thread_Function_A(void *thread_arg)
{

  char buf[7];

  int rc;  

  pthread_t self;

  self = pthread_self ();


  rc = pthread_getname_np(self, buf,7);

  if ( rc != 0 )
  cout<<"Failed getting the name"<<endl;

}


int main(int argc, char *argv[])
{
   int rc;
   pid_t thread_pid_val = getpid();
   thread_1.create_thread((thread_1.get_thread_id()), NULL,Thread_Function_A,&thread_pid_val);
   thread_2.create_thread((thread_2.get_thread_id()), NULL,Thread_Function_A,&thread_pid_val);
   rc = pthread_setname_np(*(thread_1.get_thread_id()), "Thread_A");
   if( rc != 0)
   {
     cout<<"Setting name for thread A failed"<<endl; 
   }
   rc = pthread_setname_np(*(thread_2.get_thread_id()), "Thread_B");
   if( rc != 0)
   {
     cout<<"Setting name for thread B failed"<<endl; 
   }
   pthread_join( *(thread_1.get_thread_id()), NULL);
   pthread_join( *(thread_2.get_thread_id()), NULL);

   return  0;   
}

вывод: -

$./thread_basic.out 
Failed getting the nameFailed getting the name

The name of thread is The name of thread is 

Страх говорит: числовое значение ошибки вне диапазона = 34

Добавлен полный код. Здесь я не получаю правильное имя. Вместо этого он извлекает имя программы.

void *Thread_Function_A(void *thread_arg)
{

  char name[300];
  char buf[200];

  int rc;  
  char message[100];

  FILE *fp;

  pthread_t self;

  self = pthread_self ();


  rc = pthread_getname_np(self, buf,200);

  if ( rc != 0 )
  {
    cout<<"Failed getting the name"<<endl;
    cerr<<"Pthread get name error ="<<rc<< " " << strerror(rc) << endl;  
  }

  sprintf(name,"log_%s.txt",buf);

  cout<<"The name of thread is "<<buf<<endl;

  fp = fopen(name,"w+");

  for( int i = 1; i<=5; i++)
  {
    sprintf(message,"The thread id is %d  and value of i is %d",pthread_self(),i);

    fprintf(fp,"%s\n", message);
    fflush(fp);
    /** local variable will not be shared actually**/
    /** each thread should execute the loop for 5 **/
    /** total prints should be 10 **/

  }

    pthread_exit(NULL);
}



int main(int argc, char *argv[])
{
   int rc;
   pthread_t threadA, threadB;
   pid_t thread_pid_val = getpid();
   thread_1.create_thread(&threadA, NULL,Thread_Function_A,&thread_pid_val);
   thread_1.set_thread_id(threadA);
   rc = pthread_setname_np(threadA, "Thread_A");
   if( rc != 0)
   {
     cout<<"Setting name for thread A failed"<<endl; 
   }

   thread_2.create_thread(&threadB, NULL,Thread_Function_A,&thread_pid_val);
   thread_2.set_thread_id(threadB);
   rc = pthread_setname_np(threadB, "Thread_B");
   if( rc != 0)
   {
     cout<<"Setting name for thread B failed"<<endl; 
   }
   pthread_join( threadA, NULL);
   pthread_join( threadB, NULL);

   return  0;   
}

Вывод следующий.

]$ ./thread_basic.out 
The name of thread is thread_basic.ou
The name of thread is Thread_B
  • 0
    Если вы прочтете страницу руководства, то увидите, что функция возвращает номер ошибки (вместо того, чтобы устанавливать его в errno ), вы можете распечатать это (или распечатать строку с strerror ).
  • 0
    Численный результат вне диапазона является ошибкой.
Показать ещё 2 комментария
Теги:
multithreading
linux-kernel
pthreads

2 ответа

1
Лучший ответ

В дополнение к условию гонки, которое не приведет к сбою вашего вызова, но не может вернуть то, что вы хотите, поэтому вызов завершается с ошибкой.

man 3 pthread_getname_np

Функция pthread_getname_np() может использоваться для получения имени потока. Аргумент потока указывает поток, имя которого должно быть восстановлено. Имя буфера используется для возврата имени потока; len указывает количество байтов, доступных по имени. Буфер, указанный по имени, должен содержать не менее 16 символов. Имя возвращаемого потока в выходном буфере будет завершено с нулевым значением.

char buf[7];

будет терпеть неудачу.

  • 0
    Я смог исправить это самостоятельно. Однако существует проблема с настройкой имени. Это не устанавливает имя. Я собираюсь написать сценарий снова.
  • 0
    Он не устанавливает имя, потому что ваш поток будет закончен, прежде чем вы сможете установить имя в main. Это условие гонки, о котором упоминали несколько человек.
Показать ещё 6 комментариев
1

Вы используете сочетание функций C и C++, которых следует избегать, и с частями кода, которые мы не можем проверить, например, ваш метод get_thread_id. Но проблема вашего кода очевидна, вы пытаетесь получить имена потоков слишком рано: у вашей main нет ни малейшего шанса разместить имена до того, как потоки уже завершены.

Кроме того, ваша функция потока неверна, и любой компилятор с минимальным уровнем предупреждения должен был сказать вам. Функция с non- void типом возвращаемого значения требует return заявления. В C это приведет только к неопределенному поведению, если вы будете использовать возвращаемое значение функции, которое вы не можете знать, поскольку это библиотека потоков, которая вызывает вашу функцию.

  • 0
    Как исправить это состояние гонки?
  • 0
    @SHREYASJOSHI, для всего этого, комбинация мьютекса и условной переменной - ваш друг. Это путь в POSIX для coordiante потоков , которые гарантированно работать везде.
Показать ещё 3 комментария

Ещё вопросы

Сообщество Overcoder
Наверх
Меню