получение ошибки в программе c «неопределенной ссылкой на gettid»

Это моя тема подпрограммы ... Здесь я создаю 4 потока и передаю структуру в качестве аргумента подпрограмме потока.

Я пытаюсь распечатать идентификатор потока сgetid() функция,

Я получаю сообщение об ошибке "неопределенная ссылка на gettid () ".

Я добавил необходимые заголовочные файлы ...

#include 
#include 
#include 
#define ARRAYSIZE 17
#define NUMTHREADS 4

struct ThreadData {
        int start, stop;
        int* array; 
};

void* squarer(void* td) 
{
     struct ThreadData* data=(struct ThreadData*) td;

     int start=data->start;
     int stop=data->stop;
     int* array=data->array;
     int i;
     pid_t tid1;

     tid1 = gettid(); //error at this statement//`
     printf("tid : %d\n",tid1);

     for (i=start; i
 user178129022 янв. 2014 г., 11:13
Если вы используете libc,gettid() не реализовано. Вы должны создать это самостоятельно
 PravinY22 янв. 2014 г., 11:36
@ user1781290 Спасибо за ответ ....! как реализовать функцию gettid
 user178129022 янв. 2014 г., 11:44
Никогда не пробовал сам. Но по ссылке ниже, вы можете просто(long int)syscall(224), Может быть, это поможет вамubuntuforums.org/showthread.php?t=345317
 EdH06 сент. 2015 г., 01:31
Числа системного вызова определенно различаются на разных арках. будьте осторожны - используйте вместо этого SYS_gettid.
 Sergey L.22 янв. 2014 г., 12:01
@ user1781290 Не кодируйте идентификаторы системных вызовов в своем коде, пожалуйста. На разных дистрибутивах Linux он может быть разным. Моя (Red Hat 6), например, имеетgettid на ID 186. ИспользуйтеSYS_* Макросы вместо.
 PravinY22 янв. 2014 г., 12:43
@ user1781290 спасибо за информацию, я проверил файл syscall.h и заменил идентификатор функции syscall gettid наsys_gettid вместо использования224/186, теперь утверждениеtid1 = системный вызов (SYS_gettid) ;.

Ответы на вопрос(2)

Решение Вопроса

#include <unistd.h>
#include <sys syscall.h="">

#ifdef SYS_gettid
pid_t tid = syscall(SYS_gettid);
#else
#error "SYS_gettid unavailable on this system"
#endif
</sys></unistd.h>
 SRG09 мая 2019 г., 00:37
Спасибо @ Сергей, это сработало!

Я следовал предложениям, представленным на errro, и исправил источник *ниже код без ошибок *

#include <pthread.h>
#include <stdio.h>
#include <sys types.h="">
#include <unistd.h>
#include <sys syscall.h="">

#define ARRAYSIZE 17
#define NUMTHREADS 4

struct ThreadData {
    int start, stop;
    int* array; 
};

void* squarer(void* td) 
{
 struct ThreadData* data=(struct ThreadData*) td;

 int start=data->start;
 int stop=data->stop;
 int* array=data->array;
 int i;
 pid_t tid1;

 tid1 = syscall(SYS_gettid); // here is the correct statement //
 printf("tid : %d\n",tid1);

 for (i=start; i<stop; i++)="" {="" sleep(1);="" array[i]="i*i;" printf("arr[%d]="[%d]\n",i,array[i]);" }="" return="" null;="" int="" main(void)="" array[arraysize];="" pthread_t="" thread[numthreads];="" struct="" threaddata="" data[numthreads];="" i;="" tasksperthread="(ARRAYSIZE+NUMTHREADS-1)/NUMTHREADS;" for="" (i="0;" i<numthreads;="" data[i]..stop="(i+1)*tasksPerThread;" data[i].array="array;" data[numthreads-1].stop="ARRAYSIZE;" pthread_create(&thread[i],="" null,="" squarer,="" &data[i]);="" pthread_join(thread[i],="" null);="" i<arraysize;="" printf("%d="" ",="" array[i]);="" printf("\n");="" 0;="" <="" code=""></stop;></sys></unistd.h></sys></stdio.h></pthread.h>

Ваш ответ на вопрос