C++多线程 例子

C++多线程 例子
2008-08-21 15:11
//这是2个线程模拟卖火车票的小程序
#include <windows.h>
#include
<iostream.h>

DWORD WINAPI Fun1Proc(LPVOID lpParameter);
//thread data
DWORD WINAPI Fun2Proc(LPVOID lpParameter);//thread data

int index=0;
int tickets=10;
HANDLE hMutex;
void main()
{
    HANDLE hThread1;
    HANDLE hThread2;
   
//创建线程

    hThread1
=CreateThread(NULL,0,Fun1Proc,NULL,0,NULL);
    hThread2
=CreateThread(NULL,0,Fun2Proc,NULL,0,NULL);
    CloseHandle(hThread1);
    CloseHandle(hThread2);

   
//创建互斥对象
    hMutex=CreateMutex(NULL,TRUE,"tickets");
   
if (hMutex)
    {
       
if (ERROR_ALREADY_EXISTS==GetLastError())
        {
            cout
<<"only one instance can run!"<<endl;
           
return;
        }
    }
    WaitForSingleObject(hMutex,INFINITE);
    ReleaseMutex(hMutex);
    ReleaseMutex(hMutex);
   
    Sleep(
4000);
}
//线程1的入口函数
DWORD WINAPI Fun1Proc(LPVOID lpParameter)//thread data
{
   
while (true)
    {
        ReleaseMutex(hMutex);
        WaitForSingleObject(hMutex,INFINITE);
       
if (tickets>0)
        {
            Sleep(
1);
            cout
<<"thread1 sell ticket :"<<tickets--<<endl;
        }
       
else
           
break;
        ReleaseMutex(hMutex);
    }

   
return 0;
}
//线程2的入口函数
DWORD WINAPI Fun2Proc(LPVOID lpParameter)//thread data
{
   
while (true)
    {
        ReleaseMutex(hMutex);
        WaitForSingleObject(hMutex,INFINITE);
       
if (tickets>0)
        {
            Sleep(
1);
            cout
<<"thread2 sell ticket :"<<tickets--<<endl;
        }
       
else
           
break;
        ReleaseMutex(hMutex);
    }
   
   
return 0;
}
以下是一个简单的C++多线程示例,使用C++11标准中的`<thread>`库实现。示例包含线程创建、同步(互斥锁)和基本线程操作: --- ### **示例代码:多线程计算与同步** ```cpp #include <iostream> #include <thread> #include <vector> #include <mutex> std::mutex mtx; // 互斥锁,用于同步输出 // 线程函数:打印数字 void printNumbers(int thread_id, int start, int end) { for (int i = start; i <= end; ++i) { std::lock_guard<std::mutex> lock(mtx); // 加锁,避免输出混乱 std::cout << "Thread " << thread_id << ": " << i << std::endl; } } // 线程函数:计算向量元素的和 void sumVector(const std::vector<int>& vec, int& result) { int sum = 0; for (int num : vec) { sum += num; } std::lock_guard<std::mutex> lock(mtx); // 加锁,保护共享变量 result = sum; std::cout << "Sub-sum calculated: " << sum << std::endl; } int main() { // 示例1:启动多个线程打印数字 std::thread t1(printNumbers, 1, 1, 5); std::thread t2(printNumbers, 2, 6, 10); t1.join(); // 等待线程t1结束 t2.join(); // 等待线程t2结束 // 示例2:多线程计算向量总和 std::vector<int> numbers = {1, 2, 3, 4, 5}; int total_sum = 0; // 分段计算(模拟并行) std::vector<std::thread> workers; int partial_result; std::thread worker1(sumVector, std::ref(numbers), std::ref(partial_result)); worker1.join(); // 合并结果(此处简化,实际可能需要更复杂的同步) total_sum += partial_result; std::cout << "Total sum: " << total_sum << std::endl; return 0; } ``` --- ### **关键点说明** 1. **线程创建** - 使用`std::thread`构造函数,传入函数名和参数。 - 线程函数可以是普通函数、Lambda表达式或成员函数(需绑定对象)。 2. **线程同步** - `std::mutex` + `std::lock_guard`:确保对共享资源(如`cout`或变量)的互斥访问。 - 避免竞态条件(如多个线程同时修改`result`)。 3. **线程管理** - `join()`:等待线程结束,防止主线程提前退出。 - `detach()`:让线程在后台运行(需谨慎使用,避免悬垂线程)。 4. **参数传递** - 使用`std::ref`传递引用(如`result`),否则会复制值。 --- ### **扩展:使用Lambda表达式** ```cpp #include <thread> #include <iostream> int main() { auto task = [](int id) { std::cout << "Lambda Thread " << id << " is running.\n"; }; std::thread t(task, 1); t.join(); return 0; } ``` --- ### **常见问题** 1. **线程安全** - 多个线程操作同一变量时,必须同步(如用`mutex`或原子操作`std::atomic`)。 2. **死锁风险** - 避免嵌套锁或未释放锁(推荐使用`lock_guard`自动管理锁生命周期)。 3. **性能考虑** - 线程创建有开销,频繁创建销毁线程时建议用线程池(如`std::async`或第三方库)。 --- ### **编译命令** 确保编译器支持C++11(如g++添加`-std=c++11`): ```bash g++ -std=c++11 -pthread thread_example.cpp -o thread_example ``` ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值