Различать потоки, вызываемые 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
будет знать, чтобы работать над другой частью проблемы.