在C++中,使用_beginthreadex函数创建一个新线程,并通过使用互斥对象(mutex)来实现线程同步。互斥对象可以确保多个线程不会同时访问共享资源,从而避免数据竞争和不一致问题。
下面是一个简单的示例,展示了如何使用_beginthreadex和互斥对象实现线程同步:
#include <iostream>
#include <thread>
#include <mutex>
std::mutex mtx; // 全局互斥对象
int shared_data = 0; // 共享资源
void thread_function() {
for (int i = 0; i < 100000; ++i) {
std::unique_lock<std::mutex> lock(mtx); // 加锁
++shared_data; // 修改共享资源
lock.unlock(); // 解锁
}
}
int main() {
const int num_threads = 4;
std::thread threads[num_threads];
// 创建多个线程
for (int i = 0; i < num_threads; ++i) {
threads[i] = std::thread(thread_function);
}
// 等待所有线程完成
for (auto& t : threads) {
t.join();
}
std::cout << "Shared data: " << shared_data << std::endl; // 输出共享资源的值
return 0;
}
在上面的示例中,我们创建了一个全局互斥对象mtx
和一个共享资源shared_data
。然后,我们定义了一个线程函数thread_function
,该函数使用互斥对象来保护对共享资源的访问。在main
函数中,我们创建了多个线程,并等待它们完成。最后,我们输出共享资源的值,以验证所有线程都已成功修改了它。
请注意,在上面的示例中,我们在修改共享资源之前使用std::unique_lock
对象对互斥对象进行加锁,并在修改完成后解锁。这样可以确保同一时间只有一个线程能够访问共享资源,从而实现线程同步。