2014-11-26 2 views
0

Я ищу способ передать очередь между потоками в C++, ниже - очень простой план, что я хочу сделать. Он работает как функция, но мне нужно использовать отдельный поток, так как задача и main будут иметь отдельные циклы для выполнения.Передача очереди между потоками в C++

здесь функция:

void task1(queue <bool> &qPass) 
{ 
    bool bits[5] = { 1, 0, 0, 1, 1 }; 

    for (int i = 0; i < 5; i++) 
    { 
     qPass.push(bits[i]); 
    } 

    cout << "Task:\tpush complete\t(" << qPass.size() << ")" << endl; 
} 

главный

int main() 
{ 
    queue <bool> qPass; 
    int n; 

    //thread task(task1, qPass);//thread call doesnt work 
    //task.join(); 

    task1(qPass);//function call works 

    n = qPass.size(); 
    cout << "Main:\t"; 
    for (int i = 0; i < n; i++) 
    { 
     cout << qPass.front(); 
     qPass.pop(); 
    } 
    cout << "\t(" << n << ")" << endl; 

    cin.get(); 
    return 0; 
} 

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

+0

Хм, интересно. Не передавайте ссылку на процедуру потока, вместо этого передайте указатель (или используйте захват лямбда). Кроме того, просто любопытно, какая польза от использования потока дает вам, если вы подождете, чтобы он присоединился синхронно? Или это просто образец кода? – Cameron

+0

Разве это даже компилируется?!? (О, вы на компиляторе Microsoft?) –

+0

только пример кода, цикл в действительной задаче будет выполняться до тех пор, пока не будет завершен и не будет передан (если есть что передать) каждые 100 мс или около того, основной цикл намного быстрее ~ 1 мс и необходимо выполнить задание в этом масштабе времени. im using visual studio yeh – peterjtk

ответ

1

Вам нужно обернуть аргумент в опорном обертке:

std::thread task(task1, std::ref(qPass)); 
//      ^^^^^^^^ 

(. В противном случае объекты нити связывает локальный, частный экземпляр очереди, и ваша основная очередь никогда не прикоснулась)

+0

Принятый ответ [здесь] (http://stackoverflow.com/questions/5116756/difference-between-pointer-and-reference-as-thread-parameter) описывает, что – vmg

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