it is well known that window nt is a multitask operation system that every task gets his memory and other resources through creating his process. however, window doesn't allocate cpu timeslice to process, but to threads.
window nt 系统是以线程作为运行的基本单位的,每个程序都是先创建进程(pcb,通过进程控制块体现),以进程为单位分配内存和其他资源的(例如 文件,管道,socket等)。然后会创建相应的主线程(tcb,通过线程控制块体现),等待获得cpu时间片获得cpu的使用权。例如, 我现在开了ie,qq 和 ttplayer。 那么就会有ie主线程,qq主线程和ttplayer主线程分别运行。(linux下是不一样的)。
qq这种程序估计是多线程的,否则将他做成一个单线程的程序效率会很低。所以将程序做成多线程的目的是为了提高其效率的。例如将一个计算打印程序做成2个线程的程序(1个用于计算,1个用于打印),其效率是单线程的1半偏多一点(因为需要进行线程上下文切换,会消耗一些时间)。
在主线程中创建了若干个子线程形成多线程环境后如果这些子线程需要访问进程的公共数据时肯定需要互斥进行的,这就需要线程间同步了(与进程间同步机制是一样的)。方法主要有:
1. criticial_section (临界区域)
有3个线程,主线程中创建多线程环境,子线程1访问全局对象 count ,打印5次,并且修改count=10
子线程2也需要访问count,打印10次
子线程中对count的访问需要互斥进行。否则,子线程1先访问count,但是还没访问完,子线程2开始访问,并且修改了count,那么子线程1继续访问就会发生错误了。
#include
#include
CRITICAL_SECTION section;
DWORD WINAPI threadfunc1();
DWORD WINAPI threadfunc2();
int count =5;
void main()
{
DWORD threadid1;
DWORD threadid2;
HANDLE thread1;
HANDLE thread2;
InitializeCriticalSection(§ion);
thread1=CreateThread(NULL,0,threadfunc1,NULL,0,&threadid1);
thread2=CreateThread(NULL,0,threadfunc2,NULL,0,&threadid2);
if(thread1)
{ printf("thread1launch!\n");
CloseHandle(thread1);
}
if(thread2)
{ printf("thread2 launch!\n");
CloseHandle(thread2);
}
Sleep(1000);
DeleteCriticalSection(§ion);
}
DWORD WINAPI threadfunc1()
{
int i;
EnterCriticalSection(§ion);
for(i=0; i printf("thread1 is running!\n");
count*=2;
LeaveCriticalSection(§ion);
return 0;
}
DWORD WINAPI threadfunc2()
{
int i;
EnterCriticalSection(§ion);
for(i=0; i printf("thread2 is running!\n");
count*=2;
LeaveCriticalSection(§ion);
return 0;
}
2 。mutex(互斥锁) 功能与criticize_section相同 但是其花费的时间比后者多100倍,因为他要进内核,他可以跨进程使用。
阅读(830) | 评论(0) | 转发(0) |