Я не могу заставить эту тему отображать свой идентификатор правильно - PullRequest
0 голосов
/ 20 ноября 2011
struct thread_info
{
    int       id;
    pthread_t thread_id;
    int       thread_num; 
    int       gpu;
};

struct thread_info *tinfo;

static void *GPUMon(void *userdata)
{
    struct thread_info *mythr = userdata;
    const int thread = mythr->id;

    while(1)
    {
        printf("Thread: %d\n", thread);
        Sleep(4000);
    }

    return NULL;
}

int main(void)
{
        struct thread_info *thr;

        tinfo = calloc(2, sizeof(*thr));
        for(int ka = 0; ka < 2; ka++)
        {           

            thr = &tinfo[ka];
            thr->id = ka;

            if (pthread_create(thr, NULL,GPUMon, thr))
            {
                return 0;
            }
        }   

                // some more code


    return 0;
}

По сути, поток GPUMon должен печатать идентификатор моей нити: thr-> id = ka; однако то, что я получаю, это огромные числа, такие как

Thread: 7793336
Thread: 7792616

Я не понимаю, что я делаю неправильно.

1 Ответ

3 голосов
/ 20 ноября 2011

pthread_create() принимает ссылку на pthread_id в качестве первого аргумента.

Поэтому (в качестве быстрого и грязного исправления) я бы предложил вам изменить struct thread_info на:

struct thread_info
{
  pthread_t thread_id;
  int       id;
  int       thread_num; 
  int       gpu;
};

Или (намного приятнее) позвонить pthread_create() следующим образом:

if (pthread_create(&thr->thread_id, NULL, GPUMon, thr))
{
  return 0;
}

Результаты, которые ваше решение выводит на печать, - это значения для pthread_id, присвоенные pthread_create() (или, по крайней мере, его части)в зависимости от вашей платформы), которые были случайно записаны в элемент id из struct thread_info, когда вы передали указатель на неправильную структуру.

И еще раз повторим: по крайней мере, при разработке doвключите все предупреждения компилятора на , поскольку (также в этом случае они будут иметь) они могут указать вам на вашу ошибку (ы) (gcc option -Wall)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...