스레드 안전 개념을 이해합니다. 단일 변수를 보호하려고 할 때 스레드 안전을 단순화하는 조언을 찾고 있습니다. 스레드 안전성 단일 변수 중
내가 변수가 말 :double aPass;
을 나는이 변수를 보호하려는, 그래서 난 뮤텍스 생성 :
pthread_mutex_t aPass_lock;
지금 내가이 일을 생각할 수있는 두 가지 좋은 방법이 있습니다를 그러나 둘 다 성가신 단점이 있습니다. 첫 번째는 변수를 개최 스레드 안전 클래스를 만드는 것입니다 :
class aPass {
public:
aPass() {
pthread_mutex_init(&aPass_lock, NULL);
aPass_ = 0;
}
void get(double & setMe) {
pthread_mutex_lock(aPass_lock);
setMe = aPass_
pthread_mutex_unlock(aPass_lock);
}
void set(const double setThis) {
pthread_mutex_lock(aPass_lock);
aPass_ = setThis;
pthread_mutex_unlock(aPass_lock);
}
private:
double aPass_;
pthread_mutex_t aPass_lock;
};
지금이 YAY, 만지지 적
aPass
완전히 안전, 아무것도 잘못 될 수 유지됩니다! 그러나 모든 엉망진창을보고 그것에 액세스 할 때의 혼란을 상상해보십시오. 심한.
다른 방법은 패스를 사용하기 전에 뮤텍스를 액세스 할 수있게하고 뮤텍스를 잠그는 것입니다.
pthread_mutex_lock(aPass_lock);
do something with aPass
pthread_mutex_unlock(aPass_lock);
하지만 새로운 사람이 프로젝트에 온다면, 한 번만 잊어 버리면 어떻게 될까요? 나는 그들이 어렵다고 디버깅 스레드 문제를 좋아하지 않아.
QNX를 약간의 부스트 지원으로 사용해야하기 때문에 pthread를 사용하는 것이 좋습니다. 큰 클래스가 필요하지 않고 단일 변수를 잠 그려면 더 안전한 다음 뮤텍스 잠금을 만들어야합니다.
이 변수는 전역 변수입니까? 내가 다른 많은 선택의 여지가 없다고 생각해 .. 만약 당신이 일반적인 스레드 안전 컨테이너 클래스를 만들고 싶지 않다면 - 이것은 두 번째 var에 이것을해야한다면 몇 가지 코드를 줄 것이다. –
템플릿 기반 클래스의 의미는 무엇입니까? 그 소리가 꽤 좋아. –
또한, 그것을 통해 UR 디자인을 복제 할 수 없는가? apass는 클래스이기 때문에 내가 원하는만큼의 객체를 가질 수 있습니다. –