C++线程与网络接口技术(第二节:线程共享、安全与通知等)

本文深入探讨C++中的线程共享数据,通过互斥锁避免读写不一致,介绍线程安全函数—可重入函数的原理,并详细阐述线程间的通知机制,包括轮询和信号量机制。最后提到了OSAPI在Windows平台上的线程编程应用,强调直接封装后的便利性。
摘要由CSDN通过智能技术生成

1.线程间共享数据
各线程间可访问全局变量
互斥锁:协调线程,使其步调一致(Mutex)。
g_mutex.lock()//上锁,g_mutex.unlock();//解锁
锁资源由操作系统定义。
互斥锁的使用原则:减少占用时间(尽量缩短对共享数据的访问时间)。
实例:互斥锁

#include <stdio.h>

#include "osapi/osapi.h"

char g_key[16]; // Generator更新它,Checker获取它

class KeyGenerator : public OS_Thread
{
private:
    virtual int Routine()
    {
        int times = 0;
        while(1)
        {
            // 更新key
            for(int i=0; i<16; i++)
            {
                g_key[i] = times;
            }

            times ++;
            if(times >= 128) times = 0;
            OS_Thread::Msleep(50);
        }
        return 0; 
    }
};
class KeyChecker : public OS_Thread
{
private:
    // 线程主函数
    virtual int Routine()
    {
        while(1)
        {       
            // 检查完整性
            for(int i=1; i<16; i++)
            {
                if(g_key[i] != g_key[i-1])
                {                          
                printf("g_key[%d]=%02X,g_key[%d]=%02X\n",
                    i,g_key[i],i-1,g_key[i-1]);
                    PrintKey();
                    printf("不完整!!\n");
                    return 0;
                }
            }

            OS_Thread::Msleep(50);
        }
        return 0; // 正常退出
    }

    void PrintKey()
    {
        printf("Key: ");
        for(int i=0; i<16; i++)
            printf("%02X ", g_key[i]);                  
        printf("\n");
    }
};
int main()
{
    KeyGenerator a;
    a.Run();
    KeyChecker b;
    b.Run();
    getchar();
    return 0;
}

检查线程机制,发现出现错误,出现了读写不一致。
应用锁机制:

#include <stdio.h>
#include "osapi/osapi.h"
OS_Mutex g_mutex;//定义锁
char g_key[16];//全局数据,Generator更新它,Checker获取它
class KeyGenerator:public OS_Thread
{   
private:
    virtual int Routine()
    {
        int times=0;
        while (1)
        {
            
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值