Мне нужен поток, который выполняет функцию в цикле while (скажем, увеличивает значение int).В основном мне нужно иметь цикл while, который выполняет некоторую функцию (скажем, цикл for, которая считает от 0 до 5), а затем читает текущее значение переменной в потоке.Поток должен продолжать выполнять свой цикл while независимо от того, что происходит в main.Однако значение переменной потока не должно изменяться, пока main читает переменную.
Полагаю, эту проблему можно решить с помощью атомарного.Однако это проблема игрушки, в которой переменная в потоке является int.В моей актуальной задаче переменная потока типа Eigen :: quaternionf или float [4].Поэтому мне нужно убедиться, что весь Eigen :: quaternionf или float [4] поддерживается постоянным при чтении из main.
Cout в потоке предназначен только для отладки.Если код работает с безопасностью потока, его можно удалить.Я читал из другого поста, что при использовании cout безопасным для потока способом, возможно, потребуется написать новую оболочку cout с мьютексом.Я хочу этого избежать.
Моя главная задача - прочитать переменную в правильном порядке в main.
Мой код не работает (сегодня мой первый день с многопоточностью) и ниже, как и наблюдалосьвывод (выбранные части).код не может поддерживать порядок вывода с помощью cout (искаженный вывод).Также я не уверен, что переменная потока правильно прочитана главной.
#include <thread>
#include <mutex>
#include <iostream>
int i = 0;
void safe_increment(std::mutex& i_mutex)
{
while(1)
{
std::lock_guard<std::mutex> lock(i_mutex);
++i;
std::cout << "thread: "<< std::this_thread::get_id() << ", i=" << i << '\n';
}
}
int main()
{
std::mutex i_mutex;
std::thread t1(safe_increment, std::ref(i_mutex));
while(1)
{
for(int k =0; k < 5; k++)
{
std::cout << "main: k =" << k << '\n';
}
std::lock_guard<std::mutex> lock(i_mutex);
std::cout << "main: i=" << i << '\n';
}
}
Вывод (выбранные части), который я получаю,
thread: 139711042705152, i=223893
thread: 139711042705152, i=223894
thread: 139711042705152, i=223895
main: i=223895
main: k =0
thread: main: k =1139711042705152
main: k =2
main: k =3
, i=main: k =4
223896
thread: 139711042705152, i=223897
thread: 139711042705152, i=223898
thread: 139711042705152, i=224801
thread: 139711042705152, i=224802
main: i=224802
main: k =0
main: k =1
thread: main: k =2
main: k =3
main: k =4
139711042705152, i=224803
thread: 139711042705152, i=224804
thread: 139711042705152, i=224805