我正在嘗試使用基于 HTTP 呼叫設定變數值的 API。我可以在其中設定將在 HTTP 呼叫時設定的變數的函式是 T&& 型別。我想在不同的執行緒上訪問這個變數。我試圖簡化問題并在下面的代碼中將其表示為兩個執行緒,以相同的方式訪問變數。
#include <iostream>
#include <thread>
#include <chrono>
class Values
{
public:
int i;
std::string s;
};
template<typename T>
void WriteCycle(T&& i)
{
using namespace std::chrono_literals;
while (true)
{
i ;
std::cout << i << std::endl;
std::this_thread::sleep_for(500ms);
}
}
template<typename T>
void ReadCycle(T&& i)
{
using namespace std::chrono_literals;
while (true)
{
std::cout << i << std::endl;
std::this_thread::sleep_for(500ms);
}
}
int main() {
auto v = new Values();
std::thread t1(WriteCycle<int>, v->i);
std::thread t2(ReadCycle<int>, v->i);
t1.join();
t2.join();
}
目前讀取執行緒看不到變數的任何變化。我閱讀了一個完美的轉發,移動語意和轉發參考,但我沒有得到它(我主要編程 dotnet,我的 C 知識是 C 11 之前的)。我嘗試了 std::move、std::ref 和 std::forward 的所有組合,但我無法讓讀取執行緒看到寫入執行緒的變化。有沒有辦法解決這個問題,而無需更改函式的 T&& 輸入型別(因為這是我嘗試使用的 API 的一部分)?如何以執行緒安全的方式解決這個問題?
uj5u.com熱心網友回復:
這樣的符號:
template<typename T>
void WriteCycle(T&& i)
并不真正意味著右值參考,它意味著通用參考,它可以是左值參考或右值參考,具體取決于您傳遞的資料型別。
在您的情況下,它只是一個左值參考,因此它與移動語意無關。問題是執行緒建構式對參考不太友好,您可能只想使用std::ref它來完成它:
auto myRef = std::ref(v->i);
std::thread t1(WriteCycle<&int>, myRef);
std::thread t2(ReadCycle<&int>, myRef);
但是它仍然不是完美的,因為您希望使用互斥鎖或原子值在執行緒之間進行同步
轉載請註明出處,本文鏈接:https://www.uj5u.com/ruanti/463684.html
上一篇:我需要在C 專案中選擇隨機函式
