привязать параметры функции к потоку - PullRequest
0 голосов
/ 19 января 2011

Я пытался вызвать функцию с параметрами, используя boost, но она не работает. код это

void Simulate::cr_number_threaded(lint nodes) {
    for(lint i = 0; i < trials_per_thread; i++) {
        // code
    }

}

void Simulate::run_cr_number() {
    vec_cr_number.clear();
    boost::thread t[threads];

    for(int i = 0; i < n_s.size(); i++) {
        // n_s[i] is the current number of nodes
        for(int t_idx = 0; t_idx < threads; t_idx++)
            t[t_idx] = boost::thread(cr_number_threaded, n_s[i]);
        // etc...
    }


}

я получаю следующую ошибку:

Simulate.cpp: в функции-члене 'void Имитировать :: run_cr_number () ': Simulate.cpp: 27: ошибка: не соответствует функция для вызова 'boost :: thread :: thread (, long int &)'

UPDATE: Я последовал за предложениями. Используя первое решение, я получаю

Simulate.cpp: в функции-члене void Имитировать :: run_cr_number () ': Simulate.cpp: 28: ошибка: не соответствует функция для вызова 'bind (, long int &)' ../../boost_1_44_0/boost/bind/bind.hpp:1472: примечание: кандидаты: повышение :: _ БИСТАБИЛЬНЫЙ :: bind_t ::> boost :: bind (F, A1) [с F = void (Simulate :: *) (lint), A1 = long int] ../../boost_1_44_0/boost/bind/bind.hpp:1728: Примечание:
boost :: _ bi :: bind_t :: type, boost :: _ mfi :: dm, имяТипа повышение :: _ БИСТАБИЛЬНЫЙ :: list_av_1 ::> boost :: bind (M T :: *, A1) [с A1 = long int, M = void () (lint), T = Имитировать]

используя второй, я получаю это вместо

Simulate.cpp: в функции-члене 'void Имитировать :: run_cr_number () ': Simulate.cpp: 28: ошибка: не соответствует функция для вызова «Повышение :: Thread :: своп (повышение :: _ би :: bind_t, повышение :: _ би :: List2, boost :: _ bi :: value>>) ' ../../boost_1_44_0/boost/thread/detail/thread.hpp:310: примечание: кандидаты: void повышение :: Thread :: свопа (Boost :: нитки &)

1 Ответ

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

1) boost :: thread - это не copyable, а swappable

2) вам нужно указать функцию-член и передать экземпляр

примерно так:

t[t_idx].swap(boost::thread(&Simulate::cr_number_threaded, this, n_s[i]));

в этом случае вы должны быть уверены, что this будет жить дольше, чем потоки.

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