现在,随着多核心CPU的流行,很多开发人员,不管自己的程序是否适合用多线程,都会使用多线程编程,通常就是一个主界面线程加N个工作线程,而且,常常用单线程编程的思维来操作主界面,将某些界面对象,例如CList,传到工作线程中去,让工作线程直接操作界面对象,大多数情况下,还可以运行的挺好,没问题,但是真的没问题吗?哈,问题大了。例如
UNIT MyWorkThread(LPVOID pParam)
{
....
CList * plist;
plist=(CList *)pParam;
CString str;
int i,iresult;
for(...)
{
//something you do
str.Format("Hi , this is work thread :%d , current result is:%d",i,iresult);
plist->AddString(str);
}
return 0;
}
这样的代码多的不得了,而且,在很多时候,它会正常工作的,但是,它不安全,为什么呢?很多书籍,包括WINDOWS核心编程,[当然UNIX中书籍里讲到主界面的就更少了],都没有提及,主界面的操作其实是个带锁的操作,也就是操作系统将强制保证,同一时间一个进程内最多只有一个界面操作,例如你的消息响应函数就是一个界面操作,不管你的电脑有几个CPU核心,不管你的进程有多少个工作线程,一个界面同一时间只能有一个操作
UNIT MyWorkThread(LPVOID pParam)
{
....
CList * plist;
plist=(CList *)pParam;
CString str;
int i,iresult;
for(...)
{
//something you do
str.Format("Hi , this is work thread :%d , current result is:%d",i,iresult);
plist->AddString(str);
}
return 0;
}
这样的代码多的不得了,而且,在很多时候,它会正常工作的,但是,它不安全,为什么呢?很多书籍,包括WINDOWS核心编程,[当然UNIX中书籍里讲到主界面的就更少了],都没有提及,主界面的操作其实是个带锁的操作,也就是操作系统将强制保证,同一时间一个进程内最多只有一个界面操作,例如你的消息响应函数就是一个界面操作,不管你的电脑有几个CPU核心,不管你的进程有多少个工作线程,一个界面同一时间只能有一个操作