printf和cout的线程安全问题

本文通过一个Windows平台的多线程示例展示了cout在并发输出时可能出现的问题,即输出可能被其他线程中断,导致乱序。而printf在输出时被认为是线程安全的,因为它内部实现了线程同步。因此,在多线程环境下,为了确保输出的正确性,可以优先考虑使用printf。同时,文章提到了一个接近跨平台的解决方案,但需要调整特定的函数实现以达到完全跨平台的效果。
摘要由CSDN通过智能技术生成

总结一下csdn上面的一个帖子。

cql23 提出一个问题,请看下面的例子。

#include <iostream>
#include <windows.h>
using namespace std;
const unsigned int size=10;
const unsigned int pcount=3;
const unsigned int ccount=1;
unsigned int Num=0;
int i,j;
HANDLE mutex,fullsem,emptysem;
CRITICAL_SECTION cSection;

void Get()
{

    WaitForSingleObject(mutex,NULL);
    //cout <<"消费了一件产品,产品总数:" <<--Num <<endl;   //(1)
    printf("消费了一件产品,产品总数:%d/n",--Num);               //(2)
    ReleaseMutex(mutex);
}

void Put()
{
    WaitForSingleObject(mutex,NULL);
    //cout <<"生产了一件产品,产品总数:" <<++Num <<endl; //(1)
        printf("生产了一件产品,产品总数:%d/n",++Num);         //(2)
    ReleaseMutex(mutex);
}

DWORD WINAPI Procdure(LPVOID Par)
{
    while(true)
    {
        WaitForSingleObject(fullsem,NULL);
        WaitForSingleObject(mutex,NULL);
        Put();
        Sleep(4000);
        ReleaseMutex(mutex);
        ReleaseSemaphore(emptysem,1,NULL);
    }
    return 0;
}

 

DWORD WINAPI Customer(LPVOID Par)
{
    while(true)
    {
        WaitForSingleObject(emptysem,NULL);
        WaitForSingleObject(mutex,NULL);
        Get();
        Sleep(4

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值