Как создать несколько потоков, используя одну и ту же функцию C ++ - PullRequest
0 голосов
/ 19 февраля 2019

Вот функция execute (), используемая для некоторых инструкций:

void execute() {

while (run) { //thread is running

    if (time % 3 == 0) { // execute instructions when clock is 3
        Instruct Instr;
        uint16_t src1 = 0;
        uint16_t src2 = 0;
        int target_cycle = time;
        while (target_cycle > time) {
            std::this_thread::sleep_for(thread_sleep);
        }

        while (hpp_DE_EX.size() != 0) {

            Instr = hpp_DE_EX.front();

            hpp_DE_EX.pop();

            uint16_t instr = Instr.header;

            ptrLog->PrintData(get, instr);

            src2 = instr & 0x1F;

            src1 = (instr >> 0x5) & 0x1F;

            uint16_t opcode = (instr >> 0xA) & 0x3F;   

            ....

      }


 //For running this thread:
 auto exThread = std::thread(&processor::execute, this);
 exThread.detach();

Используя эту функцию execute (), я хочу создать несколько экземпляров потоков.Я думаю, что это возможность объявить потоки (но когда я пишу этот код, я получаю некоторые ошибки - INVOKE ERROR C2672) --- ИЗМЕНЕНО и теперь работает

    std::vector<std::thread> threads;
    for (int i = 0; i <= 5; i++) // need 5 instances
    threads.push_back(thread(&processor::execute, this));

    cout << "Synchronizing all threads...\n";
    for (auto& th : threads) th.join();   // Running code  

Я собираюсь использоватьФункция execute () (потоки) для выполнения параллельных инструкций вместо линейных инструкций - функциональный параметр.

Спасибо, F.

1 Ответ

0 голосов
/ 19 февраля 2019

Предполагая, что processor::execute является статической функцией-членом без аргументов, вы передаете ей дополнительный аргумент, поэтому реализация std::thread не может найти перегрузку с правильными аргументами.Правильный вызов:

threads.push_back(thread(&processor::execute));

или более просто:

threads.emplace_back(&processor::execute);

Если это не статический метод, вам нужно передать экземпляр класса вашего процессора, например:

processor p;
for (int i = 0; i <= 5; i++)
{
    threads.emplace_back(&processor::execute, &p);
}

Судя по печати "Synchronizing all threads" Я думаю, вы не понимаете, что делает std::thread::detach, он отсоединяет поток от экземпляра std::thread, чтобы он мог продолжить работу после разрушения структуры.Я предполагаю, что вы на самом деле хотели вызвать std::thread::join, который ожидает завершения выполнения потока.std::thread::detach редко бывает правильным.

...