Создание потоков
От: darkserj  
Дата: 05.12.05 13:14
Оценка:
не получается запустить потоки в которых есть 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);
    }
}


как правильно поступить?
Re: Создание потоков
От: MaximE Великобритания  
Дата: 05.12.05 15:05
Оценка: 1 (1)
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 Yegorushkin
Posted via RSDN NNTP Server 2.0
Re: Создание потоков
От: Aera Беларусь  
Дата: 05.12.05 15:08
Оценка:
Здравствуйте, 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
--
RedApe
Re[2]: Создание потоков
От: darkserj  
Дата: 05.12.05 20:28
Оценка:
Здравствуйте, 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
Re[2]: Создание потоков
От: darkserj  
Дата: 05.12.05 20:30
Оценка:
Спасибо, заработало

D>>как правильно поступить?


A>Не копировать объект worker


Это было понятно изначально , интересовало как именно это делать... здесь Ваша помощь и оказалась кстати.
Re[3]: Создание потоков
От: MaximE Великобритания  
Дата: 06.12.05 12:02
Оценка:
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 Yegorushkin
Posted via RSDN NNTP Server 2.0
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.