두 스레드 간의 통신을 원활하게 해주는 작은 클래스를 만들려고합니다.shared_ptr이 보유한 클래스의 원 자성 멤버에 액세스
이러한 스레드는 위에서 언급 한 클래스가 스레드 풀에 대기 할 때 만들어지는 컨텍스트보다 오래 지속됩니다. 내가 지금까지 시도 무엇
class A
{
public:
A(int maxVal) : maxValue(maxVal) {}
bool IsOverMax() const { return cur >= maxValue; }
void Increase() { cur++; }
private:
const int maxValue;
atomic_int cur{ 0 };
};
가능한 사용 :
void checking(const shared_ptr<A> counter)
{
while(!counter->IsOverMax())
{
cout<<"Working\n"; // do work
std::this_thread::sleep_for(10ms);
}
}
void counting(shared_ptr<A> counter)
{
while (!counter->IsOverMax())
{
cout<<"Counting\n";
counter->Increase(); // does this fall under `...uses a non-const member function of shared_ptr then a data race will occur`? http://en.cppreference.com/w/cpp/memory/shared_ptr/atomic
std::this_thread::sleep_for(9ms);
}
}
int main()
{
unique_ptr<thread> t1Ptr;
unique_ptr<thread> t2Ptr;
{
auto aPtr = make_shared<A>(100); // This might be out of scope before t1 and t2 end
t1Ptr.reset(new thread(checking, aPtr)); // To simbolize that t1,t2 will outlive the scope in which aPtr was originaly created
t2Ptr.reset(new thread(counting, aPtr));
}
t2Ptr->join();
t1Ptr->join();
//cout<< aPtr->IsOverMax();
}
내가 걱정하는 이유는 documentation이 말한다입니다 :
실행 스레드가 여러 개 있으면 동기화없이 동일한 std :: shared_ptr 개체에 액세스하고 해당 acce sses가 shared_ptr의 비 const 멤버 함수를 사용하면 해당 원자 액세스 함수 (std :: atomic_load, std :: atomic_store 등)의 오버로드 인 이러한 함수를 통해 모든 액세스가 수행되지 않는 한 데이터 경합이 발생합니다 (). 그래서
Increase
비 CONST 함수 임)
- 는 aPtr의 사본이 문맥
the same std::shared_ptr
있지 않거나인가? - 이 코드는 스레드로부터 안전한가요?
- 비 원자 오브젝트 (정상 std :: mutex를 사용하여 읽기 및 쓰기를 잠그는 것이 정상적인 int에 대한)라고 가정해도 괜찮습니까?
- 어쨌든 왜?