进程,线程,事物概述

本文详细解释了进程和线程的概念及其区别,包括它们的数据和代码空间的特点。此外,还介绍了事务的四大特性:原子性、一致性、隔离性和持久性,并探讨了这些特性如何确保数据操作的安全性和完整性。
     进程(process)常常被定义为程序的执行。可以把一个进程看成是一个独立的程序,在内存中有其完备的数据空间和代码空间。一个进程所拥有的数据和变量只属于它自己。
    
线程(tread)是进程的一个实体,是CPU调度和分派的基本单位,它是比进程更小的能独立运行的基本单位.线程自己基本上不拥有系统资源,只拥有一点在运行中必不可少的资源(如程序计数器,一组寄存器和栈),但是它可与同属一个进程的其他的线程共享进程所拥有的全部资源.

  线程则是某一进程中一路单独运行的程序。也就是说,线程存在于进程之中。一个进程由一个或多个线程构成,各线程共享相同的代码和全局数据,但各有其自己的堆栈。由于堆栈是每个线程一个,所以局部变量对每一线程来说是私有的。由于所有线程共享同样的代码和全局数据,它们比进程更紧密,比单独的进程间更趋向于相互作用,线程间的相互作用更容易些,因为它们本身就有某些供通信用的共享内存:进程的全局数据。

  一个进程和一个线程最显著的区别是:线程有自己的全局数据。线程存在于进程中,因此一个进程的全局变量由所有的线程共享。由于线程共享同样的系统区域,操作系统分配给一个进程的资源对该进程的所有线程都是可用的,正如全局数据可供所有线程使用一样。

   

------------------------------------------------

    事务概谈

    事务有四个特性:原子性(Atomic)、一致性(Consistency)、隔离性(Isolation)和持久性(Durabiliy),简称为ACID.

    原子性:表示组成一个事务的多个数据库操作是一个不可分隔的原子单元,只有所有的操作执行成功,整个事务才提交,事务中任何一个数据库操作失败,已经执行的任何操作都必须撤销,让数据库返回到初始状态

    一致性:事务操作成功后,数据库所处的状态和它的业务规则是一致的,即数据不会被破坏。如从A账户转账100元到B账户,不管操作成功与否,A和B的存款总额是不变的.

    隔离性:在并发数据操作时,不同的事务拥有各自数据空间,它们的操作不会对对方产生干扰。准确的说,并非要求做到完全无干扰,数据库规定了多种事务隔离级别,不同隔离级别对应不同的干扰程度,隔离级别越高,数据一致性越好,但并发性越弱.

    持久性:一旦事务提交成功后,事务中所有的数据操作都必须被持久化到数据库中,即使提交事务后,数据库马上崩溃,在数据库重启时,也必须能保证能够通过某种机制恢复数据.

   


   


### Java C++ 中线程代码的注释规范 对于Java中的多线程编程,良好的注释习惯能够显著提高代码可读性维护性。当涉及到并发操作时,清晰地记录每个线程的任务、同步机制以及可能的竞争条件尤为重要[^1]。 #### Java 线程注释最佳实践 - **类级别说明**:在定义实现`Runnable`接口或者继承自`Thread`类的地方,应当描述该线程的主要职责及其预期行为。 - **方法内部解释**:针对启动新线程的方法体内,应注明创建线程的原因、传递给构造函数的对象参数含义、调用start()之后会发生什么变化等细节信息。 - **锁对象声明处备注**:如果使用了显式的锁定策略(如ReentrantLock),那么需要指明哪些资源受到保护,并且为什么选择这种特定类型的锁来解决问题。 - **共享变量访问控制**:任何涉及多个线程之间通信或数据交换的关键区域都值得特别注意;这里不仅要指出哪个成员被修改/读取,还要强调采取何种措施防止竞态条件的发生。 ```java // 定义一个简单的计数器服务作为例子展示如何添加必要的注解 public class CounterService implements Runnable { private final Object lock = new Object(); // 锁定对象用于协调不同实例间的更新活动 @Override public void run() { synchronized (lock) { // 使用内置监视器确保每次只有一个线程能进入临界区 try { Thread.sleep(10); // 模拟耗时较长的操作 /* 更新状态 */ System.out.println("Incrementing counter..."); } catch (InterruptedException e) { Thread.currentThread().interrupt(); } } } } ``` #### C++ 线程注释建议 C++标准库提供了丰富的工具支持并行计算,但在实际应用中同样需要注意通过恰当的方式表达意图: - **命名约定**:遵循一致性的命名规则可以帮助开发者快速理解各个组件的功能角色。比如以“thread_”前缀开头表示与线程管理有关的事物,“mutex_”代表互斥量等等。 - **文档化设计决策**:每当引入新的并发结构时,在源文件顶部附近的位置写下简短的设计思路概述,包括但不限于为什么要采用这种方式而不是另一种替代方案? - **API 调用上下文提示**:由于POSIX Threads API较为底层复杂,因此务必清楚地标记出所使用的具体函数原型及其作用范围,特别是那些容易引起误解的部分。 ```cpp #include <iostream> #include <thread> void thread_function(int id, std::mutex& mutex_) { for (int i = 0; i < 3; ++i){ // 尝试获取独占权以便安全打印消息到终端 std::unique_lock<std::mutex> guard(mutex_); /* 输出当前执行路径的身份编号 */ std::cout << "Thread ID: " << id << ", Iteration #: " << i + 1 << "\n"; // 自动释放关联的互斥体离开作用域后 } } int main(){ const int NUM_THREADS = 5; // 创建一组工作单元并将它们加入后台运行队列 std::vector<std::thread> workers(NUM_THREADS); static std::mutex global_mutex; for(size_t idx=0 ;idx<NUM_THREADS;++idx){ workers[idx]=std::thread(thread_function,idx,ref(global_mutex)); } // 阻塞主线程直到所有子进程完成各自的工作负载 for(auto&& worker :workers){ if(worker.joinable()){ worker.join(); } } return EXIT_SUCCESS; } ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值