VC++如何处理一个多线程
简介
多线程编程是计算机科学中的一个重要领域,它允许程序在一个或多个处理器上同时执行多个任务,在Visual C++中,可以使用C++11标准库中的<thread>
头文件来实现多线程编程,本文将详细介绍如何在VC++中处理一个多线程,包括创建线程、同步线程、等待线程结束等操作。
创建线程
1、使用std::thread
类创建线程
std::thread
类是C++11标准库中提供的一个用于表示线程的类,要创建一个线程,只需实例化一个std::thread
对象,并将要执行的函数作为参数传递给构造函数即可。
include <iostream> include <thread> void print_hello() { std::cout << "Hello from thread!" << std::endl; } int main() { std::thread t(print_hello); // 创建一个线程,执行print_hello函数 t.join(); // 等待线程结束 return 0; }
2、使用std::async
和std::future
创建线程
std::async
函数是一个异步执行函数的包装器,它返回一个std::future
对象,该对象可以用来获取线程的返回值。
include <iostream> include <future> include <thread> int add(int a, int b) { return a + b; } int main() { std::future<int> result = std::async(add, 3, 4); // 创建一个线程,执行add函数,并返回一个future对象 int sum = result.get(); // 获取线程的返回值(如果有的话) std::cout << "Sum: " << sum << std::endl; return 0; }
同步线程
1、使用互斥量(mutex)同步线程
互斥量是一种用于保护共享资源的机制,它可以确保在同一时刻只有一个线程访问共享资源,要使用互斥量同步线程,需要包含<mutex>
头文件,并创建一个互斥量对象,在需要同步的代码段前后分别调用互斥量的lock()
和unlock()
成员函数。
include <iostream> include <mutex> include <thread> std::mutex mtx; // 创建一个互斥量对象 int counter = 0; // 一个全局变量,用于计数 void increment() { for (int i = 0; i < 100000; ++i) { std::unique_lock<std::mutex> lock(mtx); // 对互斥量加锁 ++counter; // 访问共享资源(这里是全局变量counter) lock.unlock(); // 释放互斥量锁(注意不要在临界区内调用unlock()) } } int main() { std::thread t1(increment); // 创建一个线程,执行increment函数(注意这里使用了lambda表达式简化代码) t1.join(); // 等待线程t1结束(实际上已经隐式地调用了join()) std::cout << "Counter: " << counter << std::endl; // 输出全局变量counter的值(应该接近100000) return 0; }
2、使用条件变量(condition_variable)同步线程
条件变量是一种用于通知其他线程某个条件已经满足的机制,当一个线程想要检查某个条件是否满足时,它可以调用条件变量的wait()
成员函数,另一个线程可以通过调用条件变量的notify_one()
或notify_all()
成员函数来唤醒等待的线程。
include <iostream> include <condition_variable> include <mutex> include <thread> include <vector> include <chrono> include <functional> include <queue> include <atomic> include <memory> include <algorithm> include <iterator> include <semaphore.h> // Windows平台下的信号量API(仅限于Windows平台) ifdef _WIN32 // Windows平台下的信号量API(仅限于Windows平台) include <windows.h> // Windows平台下的信号量API(仅限于Windows平台) typedefHANDLE SemaphoreHandle; // Windows平台下的信号量句柄类型定义(仅限于Windows平台) SemaphoreHandle CreateSemaphore(unsigned long lInitialCount, unsigned long lMaximumCount, LPCWSTR pName); // Windows平台下的信号量创建函数(仅限于Windows平台) BOOL WaitForSingleObject(SemaphoreHandle hSemaphore, DWORD dwMilliseconds); // Windows平台下的信号量等待函数(仅限于Windows平台)// else // Unix/Linux平台下的信号量API(仅限于Unix/Linux平台)// endif // ifdef __APPLE__ // macOS平台下的信号量API(仅限于macOS平台)// endif // ifdef _WIN64 // Windows平台下64位版本的信号量API(仅限于Windows平台)// endif // ifdef _WIN32 // Windows平台下的信号量API(仅限于Windows平台)// endif // ifdef __linux__ // Linux平台下的信号量API(仅限于Linux平台)// endif // ifdef __APPLE__ // macOS平台下的信号量API(仅限于macOS平台)// endif // ifdef __FreeBSD__ // FreeBSD平台下的信号量API(仅限于FreeBSD平台)// endif // ifdef __OpenBSD__ // OpenBSD平台下的信号量API(仅限于OpenBSD平台)// endif // ifdef __HAIKU__ // Haiku平台下的信号量API(仅限于Haiku平台)// endif // ifdef __CYGWIN__ // Cygwin平台上的信号量API(仅限于Cygwin平台)// endif // if defined(__ANDROID__) || defined(__EMSCRIPTEN__) || defined(__HIP_PLATFORM__) || defined(__native_client__) || defined(__NOSYS__) || defined(__unix__) || defined(__VMS__) || defined(__VXWORKS__) || defined(__WATCOMC__) || defined(__WINDLL__) || defined(__WINNT__) || defined(__QNX__) || defined(__RTOS__) || defined(__RTEMS__) || defined(__UNIX__) || defined(__USE_MISC) || defined(__USE_XOPEN2K8) || defined(__USE_XOPEN2K8RC) || defined(__USE_XOPEN2K8XSI) || defined(__USE_XOPEN2K8XSH) || defined(__USE_XOPENMVS) || defined(__USE_XOPEN264__) || defined(__USE_IBMCPP__) || defined(__xlC__) || (defined(__MWERKS__) && (defined(__APPLE__) || defined(__HAIKU))) || (defined(__sun) && (defined( sunindex == sizeof(long) && sunsparc)) || (defined ( sunindex == sizeof(long long) && sunsparc))) || (defined(__hpux) && (defined ( __hppa__))) || (defined ( __hpux) && (defined ( __hp9k__))) || (defined ( __hpux) && (defined ( __hp11k__))) || (defined ( __hpux) && (defined ( __aix))) || (defined ( __hpux) && (defined ( __ia64))) || defined(__INTEL_COMPILER) || defined(__IBMCPP__) || (defined(__BORLANDC__) && (!defined(__WIN32__))) || defined(__TURBOC__) || defined(__DMC__) || defined((_AIX)) || defined((_HPUX)) || defined((_SGI)) || defined((_SUNPRO_CC))|| defined(__CODEGEARC__)|| defined(__GNUC__)|| defined(__GNUG__)|| defined(__MIPSEB__)|| defined(__MIPSEL__)|| defined(__LITTLEENDIAN__)|| defined(__ARMCC__)|| defined((arm))|| defined((thumb))|| defined((THUMB))|| defined((TARGET_ARM))|| defined((TARGET_ARM64))|| defined((TARGET_ARMV7K))|| defined((TARGET_RISCV))|| defined((TARGET_SPU))|| defined((TARGET_SPU64))|| (defined(TARGET_SPU7000))&&!defined(TARGET_SPU7500))|| (defined(TARGET_SPU7500))|| (defined(TARGET_SPU7600))||