线程同步的几种方法效率比较

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

摘录时间:2010-04-05 18:40

线程同步的几种方法效率比较收藏

这是我在windowsxp-vc6环境下对几种线程同步方法的效率测试结果:

#include

#include

#define ALLNUM 10000000

void testlock()

{

int timecode = GetTickCount();

for(long i=0; i

;

printf("locked model use time %d\n", GetTickCount() - timecode); }

void testunlock()

{

int timecode = GetTickCount();

for(long i=0; i

;

printf("unlock model use time %d\n", GetTickCount() - timecode); }

HANDLE sema;

void testcore()

{

CreateSemaphore(NULL, 1, 1, NULL);

int timecode = GetTickCount();

for(long i=0; i

{

WaitForSingleObject(sema, INFINITE);

i++;

ReleaseSemaphore(sema, 1, NULL);

}

printf("core model use time %d\n", (GetTickCount() - timecode) * 999); }

CRITICAL_SECTION crts;

void testcrtsec()

{

InitializeCriticalSection(&crts);

int timecode = GetTickCount();

for(long i=0; i

{

EnterCriticalSection(&crts);

i++;

LeaveCriticalSection(&crts);

}

printf("crtsec model use time %d\n", GetTickCount() - timecode);

}

void testlockasm()

{

int timecode = GetTickCount();

__asm{

mov dword ptr [ebp-8],0

lea eax,[ebp-8]

jmp point2

point1:

mov ecx,1

lock xadd dword ptr [eax],ecx

point2:

cmp dword ptr [ebp-8],ALLNUM

jge point3

jmp point1

}

point3:

printf("locked asm model use time %d\n", GetTickCount() - timecode);

}

void testunlockasm()

{

int timecode = GetTickCount();

__asm{

mov dword ptr [ebp-8],0

lea eax,[ebp-8]

jmp point2

point1:

mov ecx,1

//add dword ptr [eax],0

add dword ptr [eax],ecx

point2:

cmp dword ptr [ebp-8],ALLNUM

jge point3

jmp point1

}

point3:

printf("unlock asm model use time %d\n", GetTickCount() - timecode); }

void main()

{

testcrtsec(); //使用临界区

testcore(); //使用信号量

testlockasm(); //嵌入汇编锁方式

testunlockasm(); //嵌入汇编非同步方式

testlock(); //锁方式

testunlock(); //非同步方式

}

结果显示:

crtsec model use time 1906

core model use time 15984

locked asm model use time 687

unlock asm model use time 16

locked model use time 797

unlock model use time 31

总结:

1:在用户级别操作,且不提高中断,速度快但不能实现睡眠和唤醒

2:在用户级别操作,提高中断等级,速度比较快(锁定操作指令大概需要普通指令的30到50倍的时间),也不能实现睡眠和唤醒

3:在系统级别操作,陷入系统中执行,速度相对较慢,但只有系统级提供睡眠和唤醒(级别转换需要500~800条普通指令的时间)

临界区使用了2和3,在没有冲突的情况下运行在2,当出现冲突的情况下通过3实现睡眠和唤醒(在没有冲突的情况下,为锁定操作方式的2~3倍,也就是平均需要消耗100条左右普通指令时间完成一次没有冲突的操作),但如果冲突严重,将在此基础上加上方式3消耗的时间(最严重情况下消耗600~900条指令时间)

相关文档
最新文档