【发布时间】:2015-01-10 00:29:43
【问题描述】:
假设我有两个银行账户 A 和 B,我需要自动转账。 设置如下: `
struct account{
int64 amount;
pthread_mutex_lock m;
}
`
这是我的方法: `
bool Transfer(int from_account, int to_account, int64 amount)
{
pthread_lock(&account[from_account].m);
bool ret = false;
if(accounts[from_account].balance>=amount)
{
accounts[from_account].balance-=amount;
ret = true;
}
pthread_unlock(&account[from_account].m);
pthread_lock(&account[to_account].m);
accounts[to_account].balance+=amount;
pthread_unlock(&account[to_account].m);
return ret;
}
`
from_account 到to_account 的转账函数,返回bool,只在账户余额时转账>=ammount。 这个功能是一个好的方法吗?我想它不会导致死锁问题,但它不会使整个函数成为非原子的吗?那么可能存在竞争条件?请帮助我,非常感谢。
【问题讨论】:
-
这个函数不是原子的。并且有竞争条件。并且存在死锁情况。这不是例外安全的。所以不行。这不是一个好的方法。
-
请提出具体问题。还有,什么平台?
-
@user3799934 您是否考虑过使用c++ standards thread and synchronisation support,而不是直接使用
pthread? -
感谢您的评论。我只是好奇如何仅使用基本的 C 锁来解决这个问题。什么是好的策略?全局设置一个锁定序列怎么样?
标签: c++ pthreads critical-section