Многопоточность - PullRequest
       14

Многопоточность

0 голосов
/ 19 февраля 2011

В основном моя программа имеет 2 набора потоков, рабочих и рабочих мест. Каждое задание имеет время прибытия, затем оно помещается в очередь.

Что касается серверов, я хочу, чтобы они постоянно искали работу в очереди, если в очереди есть работа, только 1 работник снимает ее и выполняет свою работу.

В основном сначала создаются все рабочие потоки, а затем создаются и синхронизируются потоки заданий (каждый загружает данные в очередь). Я не могу правильно определить время, так как рабочие потоки иногда делают вещи в одно и то же время ИЛИ задания не помещаются в очередь в нужное время (т. Е. Задание со временем прибытия 3 передается заданию со временем прибытия 2). Как я могу сделать это, используя семафоры и / или мьютексы?

Я пытался вставить мьютекс в рабочую функцию, но у меня не очень хорошо получается мьютекс / семафор ..

Любые идеи будут оценены.

Спасибо!

Ответы [ 3 ]

1 голос
/ 19 февраля 2011

Скопировано с ответа на одного из моих предыдущих вопросов .Мой вопрос касается потоков Win32, но описанная концепция почти такая же с pthreads.

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

Вот учебник для Семафоров POSIX

Но сначала, как сказал другой парень, вы должны сделать Q поточно-безопасным.

void *func(void *newWorker) {
    struct workerType* worker = (struct workerType*) newWorker;
    while(numServed < maxJobs) {
        //if(!Q.empty()) {
        // No need to ask if Q is empty.
        // If a thread passes the sem_wait function 
        // there has to be at least one job in the Q 
        sem_wait(&semaphore);
        pthread_mutex_lock(&mutex);
        struct jobType* job = Q.front();
        numServed++;
        cout << job->jobNum << " was served by " << worker->workerNum << endl;
        Q.pop();
        pthread_mutex_unlock(&mutex);
        //sleep(worker->runTime); No need to sleep also        
        //}
    }
}


void *job(void *jobdata) {
    struct jobType *job = (struct jobType*) jobdata;
    //sleep(job->arrivtime);
    pthread_mutex_lock(&mutex);
    Q.push(job);
    pthread_mutex_unlock(&mutex);
    sem_post(&semaphore);
    // Inform the workers that another job is pushed.
}
1 голос
/ 19 февраля 2011

Операция Q push to Q pop должна быть атомарной, т. Е. (Это критический раздел).Поместите это под приобретением Mutex и выпуском Mutex.Это должно сделать это для вас.

Обратитесь к руководству по потокам posix, чтобы понять, как получить и освободить мьютексЯ использую это учебник PTHREAD

0 голосов
/ 19 февраля 2011

Проблема заключается в том, что ваши серверы выполняют три неатомарных операции очереди (пустые, затем передние, затем всплывающие) без синхронизации, чтобы гарантировать, что какой-то другой поток не чередует свои операции. Вам нужно получить мьютекс или семафор перед вызовом Q.empty и освободить его после вызова Q.pop, чтобы убедиться, что пустое трио / фронт / поп трио выполняется атомарно. Вам также нужно убедиться, что вы правильно выпустили Mutux, если Q.empty завершился неудачно

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