пул потоков. общие ресурсы.
От: fryme  
Дата: 14.02.11 11:27
Оценка:
Я почти ничего не смыслю в многопоточном программировании, поэтому прошу помощи у людей разбирающихся.
Имеется вот такой код:

class ThreadPool;

struct ThreadData {
ThreadPool *pool;
}

unsigned __stdcall thread_run(void *args) {
ThreadData *data = static_cast<ThreadData *> (args);
Task *task = data->pool->getTask();
task->invoke();
}


class ThreadPool {
public:
ThreadPool() {...}

void startAllThreads(int n) {
ThreadData *data = new ThreadData;
data->pool = this;
while (m_lThreads.size() != n) {
hThread = (HANDLE)_beginthreadex( NULL, 0, &thread_run, (void *)data, 0, &threadID );
m_lThreads.push_back( hThread );
}
}

Task *getTask() {
Task *task = m_taskQueue->pop();
return task;
}

}

int main() {
ThreadPool pool;
pool.startAllThreads(3);
for(;) {}
}

Код реализует механизм пула потоков. Содаётся Объект ThreadPool, который раздаёт задания созданным тредам.

Как я понимаю общий принцип работы такой:
— создаётся процесс main()
— он создаёт нужное количество тредов
— main становится в бесконечный цикл

while (true) {
— каждый тред запрашивает у ThreadPool задание
— когда задание выполненно запрашивается следующее
}

Но при этом непонятно:
1) если main выполняет цикл for(;) {}, то как же он при этом отвечает на запросы тредов? я не могу понять как будет выглядеть общая картина взаимодействия потоков и процесса.
2) Разве объект m_taskQueue при этом будет корректно отрабатывать запросы? Или нужно блочить очередь заданий через мьютексы или другие примитивы синхронизации?
3) А как грамотно сделать блокировку потока в среде Win?
4) При блокировке треда что с ним происходит? Ему системно выставляется какой то статус?

Есть некоторая специфика всего механизма пула потоков из-за которой приходится писать это самому, а не использовать какие то готовые решения (правда толковых я не нашёл, поэтому если у кого то есть что то подходящее с удовольствием изучу).


Заранее спасибо всем откликнувшимся!
многопоточность
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.