Различать потоки, вызываемые pthread

Поставляемый фреймворк вызывает мою функцию PartialCodec,

pthread_create(&(pcPthread[iTd]),NULL,PartialCodec,(void *)&pcMCData[iTd]);

Мне не разрешено изменять код структуры. Однако внутри PartialCodec Я хочу назначить разные задачи для разных потоков, и поэтому мне нужно различать каждый поток. Как я могу это сделать?

2 ответа

Решение

Используй аргумент, Люк.

Вы проходите &pcMCData[iTd] в качестве аргумента потока.

Так что просто добавьте несколько полей в эту структуру, сообщая потоку, над какими задачами работать. (И, очевидно, установите эти поля перед созданием потока)

pcMCData[iTd].thingToWorkOn = /* however you decide the thing to work on */;
pthread_create(&(pcPthread[iTd],NULL,PartialCodec,(void *)&pcMCData[iTd]);

Предполагая, что вы знаете, сколько потоков будет вызывать PartialCodec, ты можешь использовать static переменные внутри функции для облегчения связи между потоками. Голый static позволит все темы в PartialCodec манипулировать тем же экземпляром объекта.

void * PartialCodec (void *arg) {
    static pthread_mutex_t lock = PTHREAD_MUTEX_INITIALIZER;
    static struct state {
        /* some state */
    } critical;
    struct state local;

    pthread_mutex_lock(&lock);
    local = critical; /* make a local copy */
    /* update critical */
    pthread_mutex_unlock(&lock); 

    /* ... refer to local copy of state ... */
}

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

Другие вопросы по тегам