Это фрагмент кода. Я могу задать имя потока. Тем не менее, я получаю сообщение об ошибке при получении имени потока. Пожалуйста помоги.
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
В дополнение к условию гонки, которое не приведет к сбою вашего вызова, но не может вернуть то, что вы хотите, поэтому вызов завершается с ошибкой.
man 3 pthread_getname_np
Функция pthread_getname_np() может использоваться для получения имени потока. Аргумент потока указывает поток, имя которого должно быть восстановлено. Имя буфера используется для возврата имени потока; len указывает количество байтов, доступных по имени. Буфер, указанный по имени, должен содержать не менее 16 символов. Имя возвращаемого потока в выходном буфере будет завершено с нулевым значением.
char buf[7];
будет терпеть неудачу.
Вы используете сочетание функций C и C++, которых следует избегать, и с частями кода, которые мы не можем проверить, например, ваш метод get_thread_id
. Но проблема вашего кода очевидна, вы пытаетесь получить имена потоков слишком рано: у вашей main
нет ни малейшего шанса разместить имена до того, как потоки уже завершены.
Кроме того, ваша функция потока неверна, и любой компилятор с минимальным уровнем предупреждения должен был сказать вам. Функция с non- void
типом возвращаемого значения требует return
заявления. В C это приведет только к неопределенному поведению, если вы будете использовать возвращаемое значение функции, которое вы не можете знать, поскольку это библиотека потоков, которая вызывает вашу функцию.
errno
), вы можете распечатать это (или распечатать строку сstrerror
).