मेरे पास एक साधारण बुलियन मूल्य है जिसे मुझे परीक्षण और थ्रेड-सुरक्षित तरीके से सेट करने की आवश्यकता है। यदि एक धागा पहले से ही काम कर रहा है, तो मैं दूसरे धागे से बाहर निकलना चाहता हूं। अगर मैं std::atomic_flag
सही ढंग से समझता हूं, तो यह ठीक काम करना चाहिए।सी ++ 11 std :: atomic_flag, क्या मैं इसे सही तरीके से उपयोग कर रहा हूं?
// myclass.cpp
#using <atomic>
namespace // anonymous namespace
{
std::atomic_flag _my_flag = ATOMIC_FLAG_INIT;
} // ns
myclass::do_something()
{
if (!::_my_flag.test_and_set()))
{
// do my stuff here; handle errors and clear flag when done
try
{
// do my stuff here
}
catch (...)
{
// handle exception
}
::_my_flag.clear(); // clear my flag, we're done doing stuff
}
// else, we're already doing something in another thread, let's exit
} // do_something
अपडेट:: नीचे दिए गए सुझावों के आधार पर अपडेट कोड, एक सभ्य बनाने हालांकि, मुझे विश्वास है मैं std::atomic_flag
सही ढंग से समझ :) मैं, इस spinlock उदाहरण के लिए बचाने के लिए कई सरल उदाहरण ऑनलाइन खोजने के लिए नहीं कर पा रहे नहीं कर रहा हूँ std::atomic_flag
के उचित उपयोग के लिए टेम्पलेट। सबको शुक्रीया!
क्या यह कोड काम नहीं करता है? –
@ ब्रेंडन लोंग - मैंने अभी तक इसका पूरी तरह से परीक्षण नहीं किया है; बस यह सुनिश्चित करना चाहते हैं कि मैं आगे बढ़ने से पहले अवधारणा प्राप्त करूं ... 'मेरे सामान' भाग मेरे मामले में काफी व्यापक होगा। हालांकि मुझे पता है कि यदि आवश्यक हो तो मैं आसानी से इस कोड को संशोधित कर सकता हूं ... – Tom
आपके प्रश्न में कोई प्रश्न-चिह्न नहीं है। – inf