下面是关于“C++ 多线程编程建议之 C++ 对多线程/并发的支持(下)”的完整攻略。
什么是 C++ 对多线程/并发的支持
C++11 引入了对多线程/并发的支持,使得 C++ 语言能够更好地应对多线程程序的开发和实现。这些支持主要包括以下内容:
- std::thread 类型:C++11 引入了 std::thread 类型,它代表了一个执行线程,可以运行在独立的线程上。std::thread 类型的实例可以接受一个可调用对象(函数或者类成员函数)作为参数,并在新线程上执行该可调用对象。
- std::mutex 类型:C++11 引入了 std::mutex 类型,它代表了一个互斥锁。std::mutex 类型的实例可以用于对共享数据的访问进行同步,以避免竞争条件。
- std::atomic 类型:C++11 引入了 std::atomic 类型,它代表了一个原子类型。std::atomic 类型的实例可以保证其对应的变量的操作是原子的,以避免竞争条件。std::atomic 类型对于实现并发操作非常有用。
- std::condition_variable 类型:C++11 引入了 std::condition_variable 类型,它代表了一个条件变量。std::condition_variable 类型的实例可以用于实现线程间的同步,特别是用于等待其他线程进行一些操作或者发出信号。
如何使用 C++ 对多线程/并发的支持
以下是一个简单的使用 C++ 对多线程/并发的支持的示例:
#include <iostream>
#include <thread>
#include <mutex>
std::mutex g_mutex;
void print(const std::string &msg, int count)
{
for (int i = 0; i < count; ++i)
{
std::lock_guard<std::mutex> lock(g_mutex); // 加锁
std::cout << msg << " " << i << '\n';
}
}
int main()
{
std::thread t1(print, "Hello", 5);
std::thread t2(print, "World", 5);
t1.join();
t2.join();
return 0;
}
在这个示例中,我们使用了 std::thread 类型来创建两个线程,每个线程都调用 print 函数。print 函数使用 std::lock_guard 类型来锁定一个互斥锁(即 g_mutex),以确保在多线程环境下输出内容正确。因为互斥锁是自动控制的,所以无需手动解锁。
另外一个例子是使用 std::atomic 类型来实现一个多线程计数器:
#include <iostream>
#include <thread>
#include <atomic>
std::atomic<int> g_count(0);
void inc()
{
for (int i = 0; i < 10000000; ++i)
{
g_count++;
}
}
int main()
{
std::thread t1(inc);
std::thread t2(inc);
t1.join();
t2.join();
std::cout << "count = " << g_count << '\n';
return 0;
}
在这个示例中,我们使用了 std::atomic 类型来创建一个计数器 g_count,并且在多个线程中对其进行增量添加。因为 std::atomic 类型保证其操作是原子的,所以我们可以安全地在多线程环境下对其进行修改。最后,我们输出了计数器的结果。
总结
C++ 对多线程/并发的支持是 C++11 引入的新特性之一。它提供了一些类型和机制来方便开发多线程程序,并帮助开发人员避免竞争条件等问题的出现。在进行多线程编程时,我们应该充分利用这些支持,以提高程序的可靠性和鲁棒性。
本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:C++ 多线程编程建议之 C++ 对多线程/并发的支持(下) - Python技术站