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)
{