验证new的非原子性

测试环境:win+vs+默认编译器

注意:存在内存泄漏,仅做测试代码。
测试结果,多次跑代码创建的对象个数不一定是10000个。

#include <iostream>
#include <thread>
using namespace std;

class A {
public:
	A() {
		++a;
	}
	static int a;
};
int A::a = 0;


void thread_fun(int num) {
	while (A::a < 10000) {
		new A;
	}
}

int main() {
	thread myThread1(thread_fun, 1);
	thread myThread2(thread_fun, 2);
	thread myThread3(thread_fun, 3);
	thread myThread4(thread_fun, 4);
	myThread1.join();
	myThread2.join();
	myThread3.join();
	myThread4.join();
	cout << "end: " << A::a << endl;
	return 0;
}
### 原子性在编程和数据库事务中的意义 #### 数据库事务中的原子性 在数据库事务中,原子性表示一个事务内的所有操作要么全部成功提交,要么完全回滚,不会停留在中间状态。这种特性确保了即使遇到错误或者异常情况,数据的一致性和完整性也不会被破坏[^1]。 例如,在银行转账过程中,如果从账户A向账户B转款涉及到两个更新操作——减少A的余额以及增加B的余额,则这两个动作必须作为一个整体来对待;只有当两者都能顺利完成时才真正执行这笔交易,否则就应当撤销所有的更改以保持原有状态不变。 #### 编程环境下的原子性实现 为了保证程序运行过程中的某些关键部分具有类似的不可分割性质,开发者可以采用多种方式来达成这一目标: - **锁机制**:通过加锁的方式防止其他线程或进程干扰当前正在执行的操作序列直到其结束为止。 - **乐观并发控制 (Optimistic Concurrency Control)** :假设冲突很少发生,并允许多版本共存直至最后验证阶段再决定是否接受变更。 - **硬件指令支持**:利用现代CPU提供的特殊机器码如Compare-and-Swap(CAS),Test-and-Set(TS)等来进行细粒度同步而无需阻塞整个资源访问路径。 ```java // 使用Java中的synchronized关键字保证方法调用期间只有一个线程能够进入临界区 public synchronized void transferMoney(Account fromAccount, Account toAccount, double amount){ if(fromAccount.getBalance() >= amount){ fromAccount.setBalance(fromAccount.getBalance()-amount); toAccount.setBalance(toAccount.getBalance()+amount); }else{ throw new InsufficientFundsException(); } } ``` 上述代码片段展示了如何在一个简单的资金转移函数里运用`syncronized`关键词确保该段逻辑得以原子化地被执行,即不允许任何外部因素打断此间的连续流程。
评论 1
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值