Nota apabila menggunakan templat dalam pengaturcaraan berbilang benang C++: Elakkan mengubah suai data peribadi benang bagi fungsi ahli kelas templat. Simpan objek kelas templat dalam bekas selamat benang. Elakkan menggunakan pembolehubah statik boleh ubah dalam kelas templat. Gunakan mekanisme penyegerakan yang sesuai (seperti kunci mutex) untuk melindungi data.
Templat C++ ialah ciri berkuasa yang membolehkan kami menulis kod tanpa menyatakan jenis secara jelas. Walau bagaimanapun, terdapat beberapa perkara yang perlu diberi perhatian apabila menggunakan templat dalam pengaturcaraan berbilang benang untuk mengelakkan perlumbaan data dan isu kebuntuan.
Untuk data peribadi rangkaian, kita harus menggunakan kata kunci thread_local
untuk mengisytiharkan. Untuk fungsi ahli bukan statik, pengubahsuaian kepada data peribadi-benang dalam kelas templat mungkin menyebabkan urutan yang berbeza melihat data yang tidak konsisten. 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
dan std:: peta
. Jika objek kelas templat disimpan dalam bekas yang tidak selamat untuk benang, seperti std::list
, kerosakan data atau kebuntuan mungkin berlaku. 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; }
Atas ialah kandungan terperinci Apakah langkah berjaga-jaga untuk menggunakan templat C++ dalam pengaturcaraan berbilang benang?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!