建站之星网站建设系统,事业单位网站登录模板,qq在线登录手机版,深圳百度快速排名优化创建一个C线程需要传入几个参数#xff1f; 如何理解和使用C线程循环 C 类 函数 变量 进程 线程 C关于锁和互斥量你真的理解了吗#xff1f;
在这个例子中#xff0c;我们将创建一个简单的类#xff0c;该类包含一个共享数据成员和两个方法#xff0c;这两个方法将通过互…创建一个C线程需要传入几个参数 如何理解和使用C线程循环 C 类 函数 变量 进程 线程 C关于锁和互斥量你真的理解了吗
在这个例子中我们将创建一个简单的类该类包含一个共享数据成员和两个方法这两个方法将通过互斥锁来同步对共享数据的访问。
SharedResource 类包含一个整数数据成员和一个互斥锁。increment 和 decrement 方法使用 std::unique_lock 来锁定互斥锁。这保证了当一个线程在执行这些方法时其他线程不能同时执行它们。main 函数直接创建了两个线程分别调用 SharedResource 类的 increment 和 decrement 方法。 通过使用 std::thread 的构造函数我们将类的成员函数和对象的地址传递给线程。这样做允许线程直接调用这些成员函数。通过使用互斥锁我们确保了对共享资源的安全访问避免了数据竞争。这个程序演示了在多线程环境中如何安全地访问和修改共享数据。 t1.join();这一行确保主线程等待 t1 线程结束。t1 是之前启动的线程它执行了 incrementFunction 或类的 increment 方法。 t2.join();这一行确保主线程在继续执行之前会等待 t2 线程结束。t2 是执行 decrementFunction 或类的 decrement 方法的线程。
使用 join() 的主要原因和优势是 确保线程完成join() 确保程序中的其他逻辑只有在相关的线程执行完毕后才会执行。这对于依赖于线程结果的情况非常重要。 防止程序过早结束在主线程通常是程序的入口点中使用 join() 防止了主线程程序在子线程完成它们的工作之前结束。 避免资源泄露如果一个线程结束了它的执行但没有被 join() 或 detach()另一种处理线程的方式程序将终止并显示一个错误。使用 join() 确保每个线程都有机会正确完成避免了潜在的资源泄露。
在多数情况下如果你创建了线程你应该在某个点上调用 join()或 detach()取决于具体情况以确保线程得到正确处理。在你的代码中join() 被用来确保 t1 和 t2 线程在程序结束前完成它们的任务。
#include iostream
#include mutex
#include threadclass SharedResource {
private:int data;std::mutex mtx;public:SharedResource() : data(0) {}void increment() {std::unique_lockstd::mutex lock(mtx);data;std::cout Data incremented to data std::endl;// lock is released when it goes out of scope}void decrement() {std::unique_lockstd::mutex lock(mtx);--data;std::cout Data decremented to data std::endl;// lock is released when it goes out of scope}int getData() const {return data;}
};int main() {SharedResource resource;std::thread t1(SharedResource::increment, resource);std::thread t2(SharedResource::decrement, resource);t1.join();t2.join();std::cout Final data value: resource.getData() std::endl;return 0;
}
在 C 多线程编程中join() 方法是 std::thread 类的一个非常重要的成员函数。当你在一个线程对象上调用 join() 方法时调用它的线程通常是主线程将等待直到与该线程对象相关联的线程完成其执行。换句话说join() 使得启动线程例如主线程暂停执行直到被 join() 的线程结束其任务。
在你的代码中
t1.join();
t2.join();