大大大菜鸟

  博客园 :: 首页 :: 新随笔 :: 联系 :: 订阅 :: 管理 ::

随笔分类 -  C/C++

1 2 下一页

摘要:Code highlighting produced by Actipro CodeHighlighter (freeware)http://www.CodeHighlighter.com/-->#include"stdafx.h"structIX{virtualvoidFX()=0;};structIY{virtualvoidFY()=0;};classCA:publicIX,publicIY{virtualvoidFX(){printf("CA->FX()\n");}virtualvoidFY(){printf("CA-> 阅读全文
posted @ 2011-02-12 10:43 月蚀之罪 阅读(427) 评论(0) 推荐(0)

摘要:Apartment Model在该模型中,一个对象和一个特定的线程有关联,只有在该线程的context之中才能够调用该对象。 COM的“apartment”是一个对象产生,运作和毁灭的地方。当client要求一个指向interface的指针,它是从一个特定的线程(也就是apartment)中发出请求。这个client可能只在该apartment中使用该interface指针。当然也有可能产生一个interface指针给其他的apartment使用,这种情况你必须使用COM函数 CoMarshalInterThreadInterfaceInStream() 和CoGetInterfaceAndR 阅读全文
posted @ 2010-12-29 11:07 月蚀之罪 阅读(333) 评论(0) 推荐(0)

摘要:DLL的通告消息Notifications任何时候,当一个进程载入或卸载一个dll时,dllmain会被调用。线程也是一样的。当一个进程开始执行时,它所用到的每个dll的dllmain都会被系统调用之,并获得一个DLL_PROCESS_ATTACH消息。如果是线程开始执行,进程所用到的每一个dll的dllmain也都会被系统调用之,并获得DLL_THREAD_ATTACH消息。[代码]Win32 中,每个程序的第一个线程调用dllmain时,是以dll_process_attach调用,后续的线程才是以dll_thread_attach调用。dllmain是在新线程的context中被调用。因 阅读全文
posted @ 2010-12-28 22:17 月蚀之罪 阅读(790) 评论(0) 推荐(0)

摘要:这章很重要,所以才把放到最后写,压轴,同时希望自己能认真的总结一下。这一章主要就是异步编程的内容,自己的理解Overlapped I/O是win32的一项技术,你可以要求操作系统为你传送数据,并且在传送完毕时通知你。事实上,操作系统内部正是以线程来完成overlapped I/O,你可以获得线程的所有利益不需要付出什么代价。Win32文件操作函数 win32中有3个基本的函数来执行I/O,分别是CreateFile, ReadFile, WriteFile. 关闭文件调用CloseHandle即可。CreateFile可以用来打开各种资源,包括(不限于) 文件(硬盘,光盘,软盘或其他) 串行口 阅读全文
posted @ 2010-12-25 22:01 月蚀之罪 阅读(415) 评论(0) 推荐(0)

摘要:本章描述volatile关键字的使用,并讨论reader/writer lock的设计和运用。volatile关键字 我们写的程序经过编译器的编译之后, 编译器可能会将某些数据放到寄存器中,如果有一个线程改变了变量在内存中的值,其寄存器中的拷贝没有同步的被改,造成了数据的不一致。volatile关键字告诉编译器不要持有变量的临时性拷贝。它可以适用于基本类型,C结构和C++类,如果是后者,那么类的所有成员都会被视为volatile。使用这个关键字,并不会否定 线程同步的需要。Reference Integrity 这个我觉得就是一个锁定颗粒的问题。如果一个结构有很多组成部分,每个部分都有一个锁定 阅读全文
posted @ 2010-12-25 21:15 月蚀之罪 阅读(154) 评论(0) 推荐(0)

摘要:有计划的对付错误在每一个你的假设指出做检验工作。进入一个函数时,确认所有状态,不要只是检查指针是否合法;如果可能,检查一下指针所指结构中的数据是否一致。线程对话框 VC调试器支持多线程的情况。我们可以挂起要调试的线程之外的所有线程,从而将调试焦点放在某个线程身上。运转记录 就是使用输出如printf将程序的运行状态输出出来,用于调试,这些输出一般输出到标准输出,很容易重定向到文件中。在stdout中记录运行过程,并不能抱枕你看到的输出次序就是实际的运行次序,这是由于多线程版本的C Runtime library使用互斥保证每次只有一个线程使用stdout,所以在运行和写入stdout中间,可能 阅读全文
posted @ 2010-12-25 20:55 月蚀之罪 阅读(214) 评论(0) 推荐(0)

摘要:Win32中,每个线程都有自己专属的消息队列,并不是每个窗口都有自己的消息队列。因为每个线程能够产生很多窗口,如果一个线程停止响应,或者它忙于一段耗时的计算工作,那么由它差生的窗口统统都会停止响应,但系统中的其他窗口还是继续正常的运作。所有传递给某一窗口的消息,将由产生该窗口之线程负责处理。 对窗口所做的任何一个事情基本上都由该窗口的窗口函数处理,并因此被产生该窗口的线程处理。SendMessage()同一线程:直接调用窗口函数不同线程:切换到新线程并调用窗口函数 ,在该函数返回之前,SendMessage不会返回(所以会发生意Context Switch,比一般函数调用费时间)PostMes 阅读全文
posted @ 2010-12-25 20:26 月蚀之罪 阅读(491) 评论(0) 推荐(0)

摘要:如果要在MFC程序中产生一个线程,而该线程将调用MFC函数或者使用MFC的任何数据,那么你必须以AfxBeginThread()或者CWinThread::CreateThread()来产生这些线程,理由同C runtime library.在MFC中启动一个worker线程 如果线程调用了GetMessage或者CreateWindow之类的函数,消息队列就会产生,而worker线程就摇身一变成了GUI线程(UI线程)。 MFC对这两种线程提供了两种不同AfxBeginThread函数。以下的函数形式是用来产生worker线程的:[代码]AfxBeginThread传回的是一个指针,而不是H 阅读全文
posted @ 2010-12-21 11:31 月蚀之罪 阅读(1348) 评论(0) 推荐(0)

摘要:处理有问题的_beginthreadex()原型。优于C++编译器有更严格的类型检验,该该函数的参数第3个和第6个参数类型是unsigned int,而CreateThread是DWORD,是unsigned long。如果你声明的thrdaddr为DWORD确企图将”地址“交给他,就会出错。有2个解决方案:第一个是将变量声明为unsigned,第二个是将比那两声明为CreateThread中希望的类型,然后在调用_beginthreadex之前,在把它强制转换类型。以一个C++对象启动一个线程 C++中隐藏的this指针是得我们在启动一个线程时会遇到一些问题。每个非静态的类成员函数都有一个隐 阅读全文
posted @ 2010-12-20 14:12 月蚀之罪 阅读(239) 评论(0) 推荐(0)

摘要:不要再一个MFC程序中使用_beginthreadex()或者CreateThread(). 如果你写一个多线程程序,而且没有使用MFC,那么你应该总是和多线程版本的C - Runtime library 连接,并且总是以_beginthreadex()和_endthreadex()取代CreateThread()和ExitThread(). _beginthreadex()的参数和CreateThread一样,并且承担适当的C runtime library 初始化工作。 只要你以_beginthreadex()取代CreateThread(), 你就可以在任何线程中安全的调用任何C run 阅读全文
posted @ 2010-12-20 13:33 月蚀之罪 阅读(275) 评论(0) 推荐(0)

摘要:第14条 宁要编译时和连接时错误,也不要运行时错误能在编译时做的事情,就不要推迟到运行时。运行时的检查取决于控制流和数据的具体情况,很难知道检查是否彻底。 静态检查与数据和控制流无关静态表示的模型更加可靠静态检查不会带来运行时开销。编译时多态。定义泛型函数或类型时,考虑用编译时多态(模板)代替运行时多态(虚拟函数)。前者产生的代码能够更好地进行静态检查。(item 64)。枚举。在表示符号常量或受... 阅读全文
posted @ 2010-11-29 20:53 月蚀之罪 阅读(158) 评论(0) 推荐(0)

摘要:第12条 懂得何时和如何进行并发性编程如果应用程序使用了多线程或进程,要知道如何尽量减少共享对象,以及如何安全地共享必须共享的对象。参考目标平台的文档,了解该平台的同步化原语。最好将平台的原语用自己设计 的抽象包装起来,方便移植确保正在使用的类型在多线程程序中使用时安全的 在自己编写可用于多线程程序的类型时,必须完成2个任务:必须确保不同线程能够不加锁地使用该类型的不同对象。其次,必须在文档中说明... 阅读全文
posted @ 2010-11-29 20:08 月蚀之罪 阅读(190) 评论(0) 推荐(0)

摘要:利用terminatethread结束一个线程不建议使用这个函数 [代码]该函数是一个危险的函数,不到万不得以不使用它。TerminateThread强迫线程结束,手段激烈,线程没有机会在结束前清理自己。目标线程的堆栈也没有释放,有可能引起内存泄露。任何与此线程有关的DLLs也么有机会获得“线程解除附着”的通知。如果此线程正进入一个critical section中,那么这... 阅读全文
posted @ 2010-11-28 14:49 月蚀之罪 阅读(207) 评论(0) 推荐(0)

摘要:Critical SectionCritical Section(临界区) 用来实现“排他性占有”,使用范围是单一进程的各线程之间。它是:一个局部性对象,不是核心对象。快速有效率。不能同时有一个以上的critical section 被等待。无法侦测是否已被某个线程放弃。Mutexmutex是一个核心对像,可以在不同的线程间实现“排他性占有” ,甚至... 阅读全文
posted @ 2010-11-27 21:31 月蚀之罪 阅读(191) 评论(0) 推荐(0)

摘要:event Event对象是一种核心对象,它的唯一目的就是成为激发状态或者未激发状态。这两种状态全由程序来控制,不会成为Wait..()函数的副作用。他们的状态完全在你的掌控之下。Mutex和semaphore就不同了,他们的状态会因为诸如WaitForSingleObject()之类的函数调用而变化。所以,你可以精确地告诉一个event对象做了什么事,以及什么时候做。创建event对象 [代码]... 阅读全文
posted @ 2010-11-27 21:02 月蚀之罪 阅读(280) 评论(0) 推荐(0)

摘要:win32中的一个semaphore可以被锁住最多n次,其中n是semaphore被产生时指定的。n常常被设计成用来代表“可以锁住一份资源”的线程资源,不过并非单独一个线程就不能拥有所有的锁定。理论上,mutex是semaphore的一种退化,如果你产生一个semaphore并令最大值为1,那就是一个mutex。产生信号量(semaphore)代码Code highligh... 阅读全文
posted @ 2010-11-27 19:56 月蚀之罪 阅读(274) 评论(0) 推荐(0)

摘要:Win32的Mutex和Critical Seciton非常类似。但是他以牺牲速度来增加弹性。Mutex是核心对象Mutex 和Critical Section 的区别:锁住一个未被拥有的Mutex,比锁住一个未被拥有的Critical Section需要花费几乎100倍的时间 。Mutex可以跨进程使用。 Critical Section只能在一个进程中使用。等待一个Mutex,你可以指定... 阅读全文
posted @ 2010-11-25 16:55 月蚀之罪 阅读(672) 评论(0) 推荐(0)

摘要:Win32中进程和线程的协调工作是由同步机制(synchronous mechanism)来完成的。Critical Sections(关键区域、临界区域) 重点:一旦一个线程进入一个critical section,他就能够一而再的重复进入critical section。每个进入操作,必须对应一个离开的操作。千万不要再一个critical section中调用Sleep或任何Wait等API函... 阅读全文
posted @ 2010-11-25 15:55 月蚀之罪 阅读(520) 评论(0) 推荐(0)

摘要:1.等待一个线程的结束 调用WaitForSingleObject()并放置一个“线程核心对象”作为参数,将使线程#1开始睡眠,知道线程#2结束为止。就像Sleep函数一样,WaitForSingleObject也有一个参数用来指定最长的等待时间。[代码]或得一个线程对象的handle之后,WaitForSingleObject()要求操作系统让线程#1睡觉,知道一下任何一... 阅读全文
posted @ 2010-11-17 23:43 月蚀之罪 阅读(211) 评论(0) 推荐(0)

摘要:第4条:在代码审查上投入审查代码:更多的专注有助于提高质量 。亮出自己的代码,阅读别人的代码。互相学习,彼此都会受益。---------------------------------------------------------------设计风格 第5条:一个实体应该只有一个紧凑的职责一次只解决一个问题:只给一个实体(变量、类、函数、名称空间、模块和库)赋予一个定义良好的职责。随着实体变大,... 阅读全文
posted @ 2010-11-16 21:52 月蚀之罪 阅读(214) 评论(0) 推荐(0)

1 2 下一页