Как устранить ошибку с файлом потока из каталога Visual Studio?

#c #multithreading #visual-studio #invoke

#c #многопоточность #visual-студия #вызвать

Вопрос:

Я написал эту небольшую программу, чтобы использовать 5 потоков для вывода идентификатора и времени ЗАДЕРЖКИ ожидания. Когда я пытаюсь выполнить программу, компилятор выдает ошибки:

Ошибка C2672 ‘std::invoke’: не найдена соответствующая перегруженная функция, и C2893 не удалось специализировать шаблон функции ‘std::invoke неизвестного типа (_Callable amp;amp;,_Types amp;amp;…) noexcept()’

В нем говорится, что они оба находятся в строке 39 в файле потока из папки include в каталоге Visual Studio. Я попытался поискать решения в Интернете, но безуспешно. Можете ли вы помочь выявить проблему?

Это мой код для справки:

 // Multithreading example
// Michal Baran

#include <chrono>
#include <iostream>
#include <thread>
#include <vector>

// Import things we need from the standard library
using std::chrono::milliseconds;
using std::cout;
using std::endl;
using std::ofstream;
using std::this_thread::sleep_for;
using std::thread;
using std::vector;
using std::move;

//Declare a struct
struct ThreadArgs
{
    int id{};
    int delay{};
};

//Thread function, prints out thread id and wait delay time 10 times
void myThreadFunc(struct ThreadArgs *args)
{
    for (int i = 0; i < 10; i  )
    {
        cout << "This is id: " << args->id << endl;
        sleep_for(milliseconds(args->delay));
        cout << "Wait time: " << args->delay << "ms. " << endl;
    }
}


int main(int argc, char *argv[])
{
    // Declare an instance of a struct here
    ThreadArgs args;

    //Assign values into struct, starting with id 0 and delay 500 and rising up to id 5 and delay 900
    for (int t = 0; t < 5; t  )
    {
        int id = -1;
        int delay = 400;
        ThreadArgs th{ id= 1, delay= 100 };
    }

    //Create a vector to hold threads
    vector<thread> vecOfThreads;

    //Add thread object to vector
    vecOfThreads.push_back(thread(myThreadFunc));
    
    //Loop 5 times to create a thread and move it to the vector
    for (int t = 0; t < 5; t  )
    {
        thread th(myThreadFunc, amp;args);
        vecOfThreads.push_back(move(th));
    }
    

    // Wait for threads to finish and join them
    for (threadamp; th : vecOfThreads)
    {
        if (th.joinable())
            th.join();
    }


    return 0;
}
 

Ответ №1:

std::invoke Функция не может скомпилироваться, потому что вы дали ей недопустимые аргументы.

 //Add thread object to vector
vecOfThreads.push_back(thread(myThreadFunc));
 

Не уверен, что вы хотели там сделать, но вы пытаетесь создать новый поток с помощью myThreadFunc функции, но не даете ему необходимый параметр.

Если вы только хотели создать поток перед завершением, чтобы запустить его позже, в этом нет необходимости. Потоки начинаются сразу же после их создания, и если вы хотите создать заполнитель, просто используйте конструктор по умолчанию. Опять же, похоже, это не то, что вы пытались сделать. Здесь опущение этой строки кажется лучшей идеей (если это не просто фрагмент, а фактическая вещь делает что-то большее).

Комментарии:

1. Удаление myThreadFunc из конструктора потоков сделало эту работу. Спасибо!

2. @MichalBaran Также обратите внимание, что это означает, что один объект потока будет (в опубликованном вами примере) оставлен неиспользованным навсегда, что означает, что вы также можете удалить всю строку

3. Я рад, что вы получили свое решение, и спасибо, что поделились, я был бы признателен, если бы вы отметили их как ответ, и это будет полезно для другого сообщества.