阅读量:118
在 Linux 上设计 C++ 多线程程序时,需要考虑以下几个方面:
- 包含头文件
首先,确保包含必要的头文件。对于多线程编程,你需要包含
、、、等头文件。
#include
#include
#include
#include
- 定义互斥锁(Mutex)
互斥锁用于保护共享资源,以防止多个线程同时访问。例如,你可以使用
std::mutex来保护一个全局变量。
std::mutex mtx;
- 定义条件变量(Condition Variable)
条件变量用于线程间的同步。例如,当一个线程完成某项任务后,它可以通知其他线程继续执行。你可以使用
std::condition_variable来实现这一功能。
std::condition_variable cv;
- 定义线程函数 为每个线程创建一个函数,该函数包含线程要执行的任务。例如:
void thread_function(int id) {
// 线程任务代码
}
- 创建线程
使用
std::thread类创建线程,并将线程函数作为参数传递。例如:
std::thread t1(thread_function, 1);
std::thread t2(thread_function, 2);
- 等待线程完成
使用
join()或detach()方法等待线程完成。join()方法会阻塞当前线程,直到被调用join()的线程完成。detach()方法则会将线程设置为分离状态,当前线程不会等待该线程完成。
t1.join();
t2.join();
- 使用互斥锁和条件变量进行同步 在多线程程序中,你可能需要使用互斥锁和条件变量来同步线程。例如,当一个线程需要访问共享资源时,它可以先锁定互斥锁,然后执行任务。当任务完成后,它可以通知其他线程继续执行。
std::unique_lock lock(mtx) ;
// 访问共享资源
cv.notify_one(); // 通知其他线程
这是一个简单的 C++ 多线程示例:
#include
#include
#include
#include
std::mutex mtx;
std::condition_variable cv;
int shared_resource = 0;
void thread_function(int id) {
std::unique_lock lock(mtx) ;
std::cout << "Thread " << id class="hljs-string">" is waiting.\n";
cv.wait(lock); // 等待条件变量
shared_resource += 1;
std::cout << "Thread " << id class="hljs-string">" has incremented the shared resource to " << shared class="hljs-string">".\n";
cv.notify_one(); // 通知其他线程
}
int main() {
std::thread t1(thread_function, 1);
std::thread t2(thread_function, 2);
t1.join();
t2.join();
return 0;
}
这个示例中,两个线程等待一个条件变量,然后递增共享资源。当条件变量被通知时,线程会继续执行并更新共享资源。