当我尝试使用mutex
与RAII。多线程构造函数和析构函数
class MutexLock
{
public:
MutexLock() {
pthread_mutex_init(&mutex_, NULL);
cout << "construct of MutexLock" << endl;
}
~MutexLock() {
cout << "deconstruct of MutexLock" << endl;
pthread_mutex_destroy(&mutex_);
}
void lock() {
pthread_mutex_lock(&mutex_);
}
void unlock() {
pthread_mutex_unlock(&mutex_);
}
private:
MutexLock(const MutexLock &);
MutexLock& operator=(const MutexLock &);
pthread_mutex_t mutex_;
};
class MutexLockGuard
{
public:
explicit MutexLockGuard(MutexLock &mutex): mutex_(mutex) {
cout << "construct of MutexLockGuard" << endl;
mutex_.lock();
}
~MutexLockGuard() {
cout << "deconstruct of MutexLockGuard" << endl;
mutex_.unlock();
}
private:
MutexLockGuard(const MutexLock &);
MutexLockGuard& operator=(const MutexLock &);
MutexLock &mutex_;
};
MutexLock mutex;
int cnt = 5;
void *f(void *arg){
long t_num = (long) arg;
while(true){
MutexLockGuard lock(mutex);
if(cnt>0){
usleep(1);
cout << "args: " << t_num << " " << "cnt: " << cnt-- << endl;
}
else{break;}
}
return NULL;
}
int main()
{
pthread_t tid, tid1, tid2, tid3;
int ret = pthread_create(&tid, NULL, f,(void*)11);
if(ret == -1){
perror("create error\n");
}
ret = pthread_create(&tid1, NULL, f, (void*)22);
if(ret == -1){
perror("create error\n");
}
ret = pthread_create(&tid2, NULL, f, (void*)33);
if(ret == -1){
perror("create error\n");
}
ret = pthread_create(&tid3, NULL, f, (void*)44);
if(ret == -1){
perror("create error\n");
}
pthread_join(tid, NULL);
pthread_join(tid1, NULL);
pthread_join(tid2, NULL);
pthread_join(tid3, NULL);
return 0;
}
结果表明作为
construct of MutexLock
construct of MutexLockGuard
construct of MutexLockGuard
construct of MutexLockGuard
construct of MutexLockGuard
args: 11 cnt: 5
deconstruct of MutexLockGuard
construct of MutexLockGuard
args: 11 cnt: 4
deconstruct of MutexLockGuard
construct of MutexLockGuard
args: 11 cnt: 3
deconstruct of MutexLockGuard
construct of MutexLockGuard
args: 11 cnt: 2
deconstruct of MutexLockGuard
construct of MutexLockGuard
args: 11 cnt: 1
deconstruct of MutexLockGuard
construct of MutexLockGuard
deconstruct of MutexLockGuard
deconstruct of MutexLockGuard
deconstruct of MutexLockGuard
deconstruct of MutexLockGuard
deconstruct of MutexLock
当创建了四个线程,被创建的MutexLockGuard
四个实例。但为什么线程args: 11
被破坏,而其他三个线程的生命周期与主线程一样长呢?
你的问题是什么? “我不明白”不是一个问题。花更多的时间去理解它,然后带着一个问题来找我们。我们不是指导或教学服务;这是一个专业的问答!!!!!!!!!!!!! –
inb4是的我知道重复感叹号的讽刺 –