не получается запустить потоки в которых есть noncopyable члены (condition, mutex)
class worker {
public:
worker(int index):m_index(index) {}
void push_socket(int s) { m_sock.attach(s); ready.notify_one();}
void operator ()() {
boost::mutex::scoped_lock l(lock);
ready.wait(l);
std::cout << "Thread: " << m_index << " run" << std::endl;
std::cout << "Thread: " << m_index << " done" << std::endl;
}
protected:
int m_index;
boost::condition ready;
boost::mutex lock;
};
};
void server::create_workers(int count) {
for(int i=0;i<count;i++) {
boost::shared_ptr<worker> w(new worker(i));
workers.push_back(w);
const ia::worker &wor = *(workers[i].get());
threads.create_thread(wor);
}
}
как правильно поступить?
On Mon, 05 Dec 2005 13:14:22 -0000, darkserj <5922@users.rsdn.ru> wrote:
> не получается запустить потоки в которых есть noncopyable члены (condition, mutex)
>
> > class worker {
> public:
> worker(int index):m_index(index) {}
> void push_socket(int s) { m_sock.attach(s); ready.notify_one();}
> void operator ()() {
> boost::mutex::scoped_lock l(lock);
> ready.wait(l);
> std::cout << "Thread: " << m_index << " run" << std::endl;
> std::cout << "Thread: " << m_index << " done" << std::endl;
> }
> protected:
> int m_index;
> boost::condition ready;
> boost::mutex lock;
> };
> };
>
>
> void server::create_workers(int count) {
> for(int i=0;i<count;i++) {
> boost::shared_ptr<worker> w(new worker(i));
> workers.push_back(w);
> const ia::worker &wor = *(workers[i].get());
> threads.create_thread(wor);
> }
> }
>
>
> как правильно поступить?
Тебе нужно избежать копирования.
Попробуй заменить выделенные строки на:
threads.create_thread(bind(apply<void>(), &*w));
Вообще, я бы стартовал поток в к-торе worker.
--
Maxim YegorushkinPosted via RSDN NNTP Server 2.0
Здравствуйте, darkserj, Вы писали:
D>D> class worker {
D>public:
D> worker(int index):m_index(index) {}
D> void push_socket(int s) { m_sock.attach(s); ready.notify_one();}
D> void process() {
D> boost::mutex::scoped_lock l(lock);
D> ready.wait(l);
D> std::cout << "Thread: " << m_index << " run" << std::endl;
D> std::cout << "Thread: " << m_index << " done" << std::endl;
D> }
D>protected:
D> int m_index;
D> boost::condition ready;
D> boost::mutex lock;
D> };
D>};
D>void server::create_workers(int count) {
D> for(int i=0;i<count;i++) {
D> boost::shared_ptr<worker> w(new worker(i));
D> workers.push_back(w);
D>
D> threads.create_thread(
D> boost::function0<void>(
D> boost::bind(&worker::process, w.get()));
D> }
D>}
D>
D>как правильно поступить?
Не копировать объект worker
Здравствуйте, MaximE, Вы писали:
ME>On Mon, 05 Dec 2005 13:14:22 -0000, darkserj <5922@users.rsdn.ru> wrote:
>> не получается запустить потоки в которых есть noncopyable члены (condition, mutex)
>> как правильно поступить?
ME>Тебе нужно избежать копирования.
ME>Попробуй заменить выделенные строки на:
ME>ME>threads.create_thread(bind(apply<void>(), &*w));
ME>
не получается, компилятор аргументирует тем, что не может стартовать функцию f в apply::operator ()
ME>Вообще, я бы стартовал поток в к-торе worker.
Почему? какие преимущества?
ME>--
ME>Maxim Yegorushkin
Спасибо, заработало
D>>как правильно поступить?
A>Не копировать объект worker
Это было понятно изначально
, интересовало как именно это делать... здесь Ваша помощь и оказалась кстати.
On Mon, 05 Dec 2005 20:28:49 -0000, darkserj <5922@users.rsdn.ru> wrote:
> Здравствуйте, MaximE, Вы писали:
>
> ME>On Mon, 05 Dec 2005 13:14:22 -0000, darkserj <5922@users.rsdn.ru> wrote:
>
>>> не получается запустить потоки в которых есть noncopyable члены (condition, mutex)
>>> как правильно поступить?
>
> ME>Тебе нужно избежать копирования.
>
> ME>Попробуй заменить выделенные строки на:
>
> ME>> ME>threads.create_thread(bind(apply<void>(), &*w));
> ME>
> не получается, компилятор аргументирует тем, что не может стартовать функцию f в apply::operator ()
Да, проверил, apply<> не поддерживает вызовы по указателю
> ME>Вообще, я бы стартовал поток в к-торе worker.
>
> Почему? какие преимущества?
Тут у тебе получается two phase construction: 1) создаем объект, 2) пускаем в него поток. Если 2 обламывается, то объект был создан напрасно. Более логично, если объект либо создается с потоком, либо не создается вообще.
--
Maxim YegorushkinPosted via RSDN NNTP Server 2.0