我尝试了几种逻辑来处理我的这个问题。
- 使用线程本地存储 (TLS)
#include <iostream>
#include <thread>
void thread_function() {
thread_local int local_var = 0;
local_var++;
std::cout << "Local variable value: " << local_var << std::endl;
}
int main() {
std::thread t1(thread_function);
std::thread t2(thread_function);
t1.join();
t2.join();
return 0;
}
- 应用智能指针
#include <iostream>
#include <memory>
void shared_pointer_example() {
std::shared_ptr<int> sptr(new int(10));
std::shared_ptr<int> sptr2 = sptr; // reference count increased
std::cout << "Shared Pointer value: " << *sptr << std::endl;
}
void unique_pointer_example() {
std::unique_ptr<int> uptr(new int(20));
std::cout << "Unique Pointer value: " << *uptr << std::endl;
// std::unique_ptr<int> uptr2 = uptr; // Error: unique_ptr cannot be copied
}
int main() {
shared_pointer_example();
unique_pointer_example();
return 0;
}
- 实现无锁数据结构
#include <iostream>
#include <atomic>
#include <vector>
#include <thread>
std::atomic<int> atomic_counter(0);
void increment() {
for (int i = 0; i < 1000; ++i) {
atomic_counter++;
}
}
int main() {
std::vector<std::thread> threads;
for (int i = 0; i < 10; ++i) {
threads.emplace_back(increment);
}
for (auto& t : threads) {
t.join();
}
std::cout << "Atomic Counter: " << atomic_counter.load() << std::endl;
return 0;
}
但实际上,没有一个是直观的,或者足够好到可以真正发挥作用。我该怎么办?
我已经尝试了上面提到的 4 种解决方案
我相信一个例子胜过一千个抽象的词语。看看我列举的一些例子:
该池允许高效的对象分配和释放,而无需频繁的堆分配,这在多线程应用程序中可能会很昂贵。
每个工作线程尝试获取一个对象 1000 次。如果成功,它会递增计数器并将对象释放回池中。我演示了一个线程安全的内存池,具有高效的对象分配和释放。
std::scoped_lock
这里的使用确保一次只有一个线程可以访问池,从而防止数据争用。std::atomic counter
提供了一种无锁的方式来计算成功的对象获取!我希望你能理解。这个问题真的很有趣。我以前也处理过这个问题,希望能和大家分享一下!
如果我正确理解了你的问题,答案就简单多了。
您可以将指针作为参数传递给线程:
输出 :
或者,如果所有线程都使用相同的功能,则可以使用一个
static
变量(该变量仅初始化一次,并保存在内存中直到程序执行结束):输出 :
C++ 参考