Remarques lors de l'utilisation de modèles dans la programmation multithread C++ : évitez de modifier les données privées du thread des fonctions membres de la classe modèle. Stockez les objets de classe de modèle dans un conteneur thread-safe. Évitez d'utiliser des variables statiques mutables dans les classes de modèles. Utilisez des mécanismes de synchronisation appropriés (tels que les verrous mutex) pour protéger les données.
Les modèles C++ sont une fonctionnalité puissante qui nous permet d'écrire du code sans spécifier explicitement de types. Cependant, il y a certaines choses à noter lors de l'utilisation de modèles dans une programmation multithread pour éviter les courses de données et les problèmes de blocage.
Pour les données privées des threads, nous devons utiliser le mot-clé thread_local
pour déclarer. Pour les fonctions membres non statiques, les modifications apportées aux données privées des threads dans la classe de modèle peuvent amener différents threads à voir des données incohérentes. thread_local
关键字来声明。对于非静态成员函数,对模板类中线程私有数据的修改可能导致不同线程看到不一致的数据。
class MyClass { public: thread_local int x; void modifyX() { ++x; // 可能导致数据竞争 } };
在多线程环境中,应使用线程安全的容器,例如 std::vector
和 std::map
。如果将模板类对象存储在非线程安全的容器中,例如 std::list
std::vector<MyClass> objects; // 线程安全 std::list<MyClass> objects; // 非线程安全,可能导致数据损坏或死锁
std::vector
et std:: carte< /code>. Si un objet de classe de modèle est stocké dans un conteneur non thread-safe, tel que <code>std::list
, une corruption des données ou un blocage peut en résulter. template <typename T> class MyClass { public: static int x; // 可变静态变量,可能导致数据竞争 static void modifyX() { ++x; // 可能导致数据竞争 } };
std::mutex m; template <typename T> class MyClass { public: void modifyX() { std::lock_guard<std::mutex> lock(m); ++x; // 受互斥锁保护 } };
#include <iostream> #include <thread> #include <vector> template <typename T> class Counter { private: std::mutex m; T count; public: Counter() : count(0) {} void increment() { std::lock_guard<std::mutex> lock(m); ++count; } T get() const { std::lock_guard<std::mutex> lock(m); return count; } }; int main() { // 创建一个`Counter`模板类的对象 Counter<int> counter; // 创建多个线程并并发增加计数器 std::vector<std::thread> threads; for (int i = 0; i < 10; ++i) { threads.emplace_back([&counter] { for (int j = 0; j < 10000; ++j) { counter.increment(); } }); } // 等待所有线程完成 for (auto& thread : threads) { thread.join(); } // 输出计数器的最终值 std::cout << counter.get() << std::endl; return 0; }
Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!