加锁的函数里返回值
想在加锁的函数里返回值
- C/C++ code
int count = 0;// 这样是绝对不行的。int f() { pthread_mutex_lock(&mutex_); return count++; pthread_mutex_unlock(&mutex_);}// 这样还是不行。int f() { pthread_mutex_lock(&mutex_); int ret = count++; pthread_mutex_unlock(&mutex_); return ret;}// 这样是可以的。int f(int& val) { pthread_mutex_lock(&mutex_); val = count++; pthread_mutex_unlock(&mutex_);}// 这样也是可以的。int f() { MutexLockGuard lock(mutex_); // RAII return count++;}
现在求其它可行方案,开始吧 。。。
哎,苦逼的王皓又输了。。。
[解决办法]
你不是有方案了么
[解决办法]
喜欢最后一个,
不用考虑unlock问题
[解决办法]
pthread_mutex_unlock(&mutex_); 这个是必须要执行的,就是说在执行它之前不能有返回值。
但是执行它之后 在返回的话就可能被修改。
貌似没其他方案了
[解决办法]
额 把count和一个mutex放到一个class里面吧。 mutex是不是要弄成静态成员就看你自己需要了。
[解决办法]
- C/C++ code
// 这样还是不行。int f() { pthread_mutex_lock(&mutex_); int ret = count++; pthread_mutex_unlock(&mutex_); return ret;}// 这样是可以的。int f(int& val) { pthread_mutex_lock(&mutex_); val = count++; pthread_mutex_unlock(&mutex_);}// 这样也是可以的。int f() { MutexLockGuard lock(mutex_); // RAII return count++;}
[解决办法]
返回一个副本呗
[解决办法]
int f() {
return __sync_add_and_fetch(count);
}
[解决办法]
[解决办法]
- C/C++ code
void f(int (*setcount)(int)) { MutexLockGuard lock(mutex_); // RAII (*setcount)(++count) }
[解决办法]
[解决办法]
我喜欢第一个,比效霸气也标新立异啊
[解决办法]
int f() {
MutexLockGuard lock(mutex_); // RAII
return count++;
}
这样最安全,锁的目的就是为了保证同时只有一个线程访问。
[解决办法]
总之就是确保返回之前正确解锁就是可以了