2011-02-19 2 views
0

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

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

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

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

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

Спасибо!

+0

Ваша терминология болезненна. Перепишите это с помощью сервера = worker, client = job, client thread = server. –

+2

Ugh. За исключением использования 'std :: cout', это чистый C-код. Знаете ли вы, что C++ намного больше, чем просто C-надстройка? Если вы так любите C, вы даже используете ключевое слово 'struct', где C++ не требует его, но C does, то почему бы не отказаться от потоков в пользу' printf() 'и т. Д. И сделать чистую C? Как вы это делаете, толпа C недовольна тем, что использует потоки, и толпу C++ для использования C, за исключением потоков. – sbi

ответ

0

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

1

Скопировано из answer в one of my earlier questions. Мой вопрос касается потоков Win32, но описанный консепт почти такой же, как и pthreads.

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

Вот учебник для POSIX Semaphores

Но сначала, как сказал другой парень, вы должны сделать 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. 
} 
+0

Спасибо, я попробую это. Будет ли начальное значение семафора равным 0? – user623982

+0

@ user623982: Да, 0 будет хорошо.В этом случае значение семафора равно текущему числу заданий в Q. –

+0

Что делать, если мне нужны обе функции для сна? Рабочие места спадают со своего времени прибытия до того, как их выталкивают в очередь, рабочие спят свое время работы после приобретения работы. Я пробовал делать это несколькими способами, но получаю неправильные результаты. – user623982

1

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

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

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