2016-04-07 2 views
-1

Предоставляемая структура вызывает мою функцию PartialCodec.Дифференциация между нитями, называемыми pthread

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

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

+0

Здесь не секрет. У вас есть два простых способа определить, что делает поток: Один, 'void * (*) (void *)' -argument определяет, какая функция начинает поток, Two, 'void * 'определяет, что аргумент этой функции будет. – EOF

+0

Каждый поток автоматически переходит к функции PartialCodec, и аргумент одинаковый для всех потоков. –

+1

. Вы не показываете весь свой код, но мы предполагаем, что 'iTd' отличается для каждого потока, что должно означать, что каждый поток получает другой указатель к элементу 'pcMCData'. – jxh

ответ

0

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

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

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

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

Это действительно часть моего проекта, и мне был предоставлен набор кода, который я не должен изменять. Я могу писать только внутри функции PartialCodec. –

+0

Итак, возможно, более точно сказать: «кто-то еще запускает потоки, используя' pthread_create() '...« –

+0

Да, мой профессор написал код для запуска потоков, и я не должен его менять. –

1

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

Смежные вопросы