我想打印數據隊列的元素的當前數目在每一秒在多線程的程序是這樣的:打印當前數
queue<int> products;
void print(ostream& s)
{
cout << s.rdbuf();
cout.flush();
s.clear();
}
void printQueue()
{
while(true)
{
this_thread::sleep_for(chrono::seconds(1));
print(stringstream() << "Number of prouducts: " << products.size() << "\n");
}
}
void producer(int i)
{ //adds data into queue in thread safe manner
}
void consumer(int i)
{/*removes data from queue in thread safe manner*/}
int main()
{
vector<thread> thrds;
for(int i = 0; i < 5; ++i)
thrds.push_back(thread(producer, i));
for(int i = 0; i < 4; ++i)
thrds.push_back(thread(consumer, i));
thrds.push_back(thread(printQueue));
for(auto& t : thrds)
t.join();
}
return 0;
}
打印隊列 - 這是功能線程安全?
你能不能給一個指針,指示常量的訪問是線程安全的?我評論了一個收益(現在已刪除)的答案,其中提出了類似的聲明,並且確定「deque」的大小可能需要跳過幾個指針,所以任何兩者之間的變化都可能導致競爭。 –
@UlrichEckhardt,我相信上面已經說清楚了。 deque的size()是線程安全的,也就是說,你可以同時從多個線程調用它。同時不安全的函數調用它是一個數據的比賽,而且我明確提出這樣:*意義,不可能有其他調用到容器的任何其他方法,而這個調用發生* – SergeyA
因此,所有你需要做的安全地使用size()可以確保沒有其他線程同時調用不安全的方法。你有什麼關於如何實現這種魔法的建議嗎?如果沒有這種保護,尺寸方法的「線程安全性」並不值得。 –