加锁的函数里返回值

冻结 2012-08-03 04:16:58
想在加锁的函数里返回值


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++;
}



现在求其它可行方案,开始吧 。。。












哎,苦逼的王皓又输了。。。
...全文
459 16 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
16 条回复
切换为时间正序
请发表友善的回复…
发表回复
一叶之舟 2012-08-04
  • 打赏
  • 举报
回复
int f() {
MutexLockGuard lock(mutex_); // RAII
return count++;
}

这样最安全,锁的目的就是为了保证同时只有一个线程访问。
RLib 2012-08-04
  • 打赏
  • 举报
回复
总之就是确保返回之前正确解锁就是可以了
冻结 2012-08-03
  • 打赏
  • 举报
回复
大家回复呀,300技术分呢。。。
franzhong 2012-08-03
  • 打赏
  • 举报
回复
我喜欢第一个,比效霸气也标新立异啊
冻结 2012-08-03
  • 打赏
  • 举报
回复
[Quote=引用 7 楼 的回复:]

返回一个副本呗
[/Quote]

对。。。



// 这样是可以的,但是如果是类或结构体,就要拷贝构造了。
int f() {
pthread_mutex_lock(&mutex_);
int ret = count++;
pthread_mutex_unlock(&mutex_);
return ret;
}

其实我原来的意思是
int f() {
pthread_mutex_lock(&mutex_);
count++;
pthread_mutex_unlock(&mutex_);
return count;
}


大家不要关注count++,我只是随便写的实例代码,实际很少有这么简单。
原子加,linux和window都有相关的API。
冷月孤城 2012-08-03
  • 打赏
  • 举报
回复
[Quote=引用 10 楼 的回复:]

C/C++ code

void f(int (*setcount)(int)) {
MutexLockGuard lock(mutex_); // RAII
(*setcount)(++count)
pthread_mutex_unlock(&mutex_);
}


单纯改变数目这种方式属于脱裤子放屁,如果有一些复杂操作什么的可以考虑一下。
[/Quote]忘了写解锁了
冷月孤城 2012-08-03
  • 打赏
  • 举报
回复

void f(int (*setcount)(int)) {
MutexLockGuard lock(mutex_); // RAII
(*setcount)(++count)
}

单纯改变数目这种方式属于脱裤子放屁,如果有一些复杂操作什么的可以考虑一下。
vilnies 2012-08-03
  • 打赏
  • 举报
回复
[Quote=引用 8 楼 的回复:]

int f() {
return __sync_add_and_fetch(count);
}
[/Quote]上面发错了。这样也可以吧
int f() {
return __sync_add_and_fetch(&count,1);
}
vilnies 2012-08-03
  • 打赏
  • 举报
回复
int f() {
return __sync_add_and_fetch(count);
}
ouyh12345 2012-08-03
  • 打赏
  • 举报
回复
返回一个副本呗
一叶之舟 2012-08-03
  • 打赏
  • 举报
回复

// 这样还是不行。
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++;
}

这三种都是可以的。
pengzhixi 2012-08-03
  • 打赏
  • 举报
回复
额 把count和一个mutex放到一个class里面吧。 mutex是不是要弄成静态成员就看你自己需要了。
十八道胡同 2012-08-03
  • 打赏
  • 举报
回复
pthread_mutex_unlock(&mutex_); 这个是必须要执行的,就是说在执行它之前不能有返回值。
但是执行它之后 在返回的话就可能被修改。

貌似没其他方案了
wenbin 2012-08-03
  • 打赏
  • 举报
回复
喜欢最后一个,
不用考虑unlock问题
冻结 2012-08-03
  • 打赏
  • 举报
回复
[Quote=引用 1 楼 的回复:]

你不是有方案了么
[/Quote]

我想知道还有没有其它的方案?
pengzhixi 2012-08-03
  • 打赏
  • 举报
回复
你不是有方案了么

65,189

社区成员

发帖
与我相关
我的任务
社区描述
C++ 语言相关问题讨论,技术干货分享,前沿动态等
c++ 技术论坛(原bbs)
社区管理员
  • C++ 语言社区
  • encoderlee
  • paschen
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
  1. 请不要发布与C++技术无关的贴子
  2. 请不要发布与技术无关的招聘、广告的帖子
  3. 请尽可能的描述清楚你的问题,如果涉及到代码请尽可能的格式化一下

试试用AI创作助手写篇文章吧