C++之include guard

有时候,我们在大的软件项目中需要避免一个头文件被同一个源文件引用多次,这个时候就需要用到include guard这个头文件保护符。

下面这串代码演示了如何使用#ifndef和#endif来避免头文件被重复引用

#pragma once
//Time Class definition
//member functions are declared in time.cpp

//prevent multiple inclusions of header
#ifndef TIME_H
#define TIME_H

//time class definition
class time
{
public:
	Time();//constructor
	void setTime(int, int, int);//set hour, minute and second
	void printUniversal() const;//print time in universal-time format
	void printStandard() const;//print time in standard-time format

private:
	unsigned int hour;//0-23
	unsigned int minute;//0-59
	unsigned int second;//0-59

};

#endif // !TIME_H

我们可以看到,被包括住的部分,有一个判断,就是,如果头文件已经被引用,就不执行下面的操作。如果没有被引用,就define一下这个time.h

注意,我们需要用大写来代表头文件的名称,然后使用下划线来代表’ . ‘

 

欢迎关注我的公众号 灯珑 与你分享更多编程的经验!

 

### C++ 中 `std::lock_guard` 的使用方法 #### 示例代码展示 以下是展示了如何在代码块内使用 `std::lock_guard` 对象来保护共享资源: ```cpp #include <mutex> std::mutex m; void foo() { { std::lock_guard<std::mutex> guard(m); // 创建 std::lock_guard 实例并自动锁定互斥锁 m // 这里可以执行需要同步的操作,比如修改共享数据结构 } // 当离开此作用域时,guard 被销毁,m 自动解锁 } ``` 这段程序定义了一个名为 `foo()` 的函数,在该函数内部创建了局部变量 `guard` 来实例化 `std::lock_guard` 并传入互斥体 `m`。这会立即尝试获取锁;如果成功,则继续执行后续语句直到结束大括号 `{}` 或抛出异常之前都不会释放它。 一旦超出其所在的作用范围(即当控制流离开了包围它的花括号),析构函数就会被调用来解除关联的 mutex 上面设置好的独占权限[^1]。 #### 关键特性说明 - **RAII机制**:通过构造函数获得锁,而通过析构函数释放锁的方式遵循了C++中的资源获取即初始化(Resource Acquisition Is Initialization)原则。 - **简化并发编程模型**:无需手动调用 lock/unlock 方法,减少了因忘记解锁而导致潜在的竞争条件或死锁的风险。 - **不可转移所有权**:不像某些其他类型的锁那样支持移动操作符,这意味着不能将已持有的锁传递给另一个对象处理[^2]。 #### 应用场景举例 考虑一个多线程环境下的计数器增加情况: ```cpp #include <iostream> #include <thread> #include <mutex> std::mutex mtx; int global_counter = 0; void thread_task() { for (size_t i = 0; i != 1000; ++i){ std::lock_guard<std::mutex> lk(mtx); ++global_counter; } } int main(){ std::thread th1(thread_task), th2(thread_task); th1.join(); th2.join(); std::cout << "Final Counter Value:" << global_counter << '\n'; return 0; } ``` 在这个例子中,两个独立的工作线程同时运行相同的任务——每次迭代都试图更新全局整型变量 `global_counter`。为了防止竞争状态的发生,每当要改变这个值的时候都会先建立一个新的 `std::lock_guard` 守护者去持有互斥量 `mtx`,从而确保同一时刻只有一个线程能够进入临界区进行写入操作[^3]。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值