Как узнать, какой поток выполняет функцию? - PullRequest
0 голосов
/ 24 апреля 2020

Итак, у меня есть уменьшенная версия программы лифта, которая использует pthreads в c. Каждый поток представляет собой отдельный лифт, который вызывает функцию request(). Я не уверен, как узнать, какие лифты (1, 2 или 3), которые являются потоками, используют запрос функции. В функции запроса мне нужно напечатать, какой поток использовал его в то время. Извините, если мое объяснение не имеет полного смысла.

void* request(void* abc)
{ 
    int ii;
    for(ii = 0; ii < 8; ii++)
    {
        sleep(1);
        printf("REQUEST FROM LIFT COMPLETED\n");
    }
}
int main()
{
    pthread_t lift1;
    pthread_t lift2;
    pthread_t lift3;

    pthread_create(&lift1, NULL, request, NULL);
    pthread_create(&lift2, NULL, request, NULL);
    pthread_create(&lift3, NULL, request, NULL);

    pthread_join(lift1, NULL);
    pthread_join(lift1, NULL);
    pthread_join(lift1, NULL);

    return 0;
}

1 Ответ

6 голосов
/ 24 апреля 2020

Вы можете сделать это несколькими способами, самый простой - передать какое-либо значимое значение в качестве параметра потока для идентификации каждого потока.

Вот пример:

void *request(void *data)
{ 
    const int id = *(const int *)data;
    int ii;

    for(ii = 0; ii < 8; ii++)
    {
        sleep(1);
        printf("REQUEST FROM LIFT %d COMPLETED\n", id);
    }
}

int main()
{
    const int id1 = 1, id2 = 2, id3 = 3;
    pthread_t lift1;
    pthread_t lift2;
    pthread_t lift3;

    pthread_create(&lift1, NULL, request, (void *)&id1);
    pthread_create(&lift2, NULL, request, (void *)&id2);
    pthread_create(&lift3, NULL, request, (void *)&id3);

    pthread_join(lift1, NULL);
    pthread_join(lift1, NULL);
    pthread_join(lift1, NULL);

    return 0;
}

Вы также можете определить эти id переменные как static глобальные:

// Outside main:
static const int id1 = 1, id2 = 2, id3 = 3;
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...