VS/C++多线程程序设计举例

VS/C++多线程程序设计举例不同平台的多线程程序设计,基本上都大同小异,本文介绍一下VS/C++平台下的多线程程序开发,下面以视觉软件的设计与实现为例。

大家好,欢迎来到IT知识分享网。

不同平台的多线程程序设计,基本上都大同小异,本文介绍一下VS/C++平台下的多线程程序开发,下面以视觉软件的设计与实现为例。

线程创建

HANDLE m_hThreadControl;

m_hThreadControl = ::CreateThread(NULL, 0, ThreadControl, (LPVOID)this, 0 ,0);

由于线程函数是回调函数,因此必须定义成静态函数。其中,m_hThreadControl用来保存线程句柄。

线程函数定义

DWORD WINAPI 类名::ThreadControl(LPVOID lpData)

{

类名 *This = reinterpret_cast<类名 *>(lpData);

}

其中,This指针是传递过来的对象指针,必须经过强制转换才能使用;

线程终止

当需要线程终止时,不要使用ExitThread()函数,这样会造成内存泄露。可以采用线程函数的return返回,这样终止线程是最安全的,。因为在线程函数里采用return返回后, 系统会自动清理函数内申请的类对象。

线程互斥

有时候,为了实现线程函数中某些函数的不间断执行,需要用到互斥锁。

比如:

HANDLE hMutex = NULL;

WaitForSingleObject(hMutex);

m_Cameral1.SingleGrab(&m_ImageThread);

ReleaseMutex(hMutex);

其中m_Cameral1.SingleGrab()函数的执行就不会被打断,就因为采用了互斥锁。

VS/C++多线程程序设计举例

多线程设计

以上谈到是关于线程的一些基本操作,在分析具体代码之前,还需要了解两个基本概念,临界区和事件。

临界区

临界区(Critical Section)是一段供线程独占式访问的代码区,也就是说若有一线程正在访问该代码段,其它线程也想要访问,只能等待当前线程离开该代码段方可进入,这样保证了线程安全。在Window系统中,采用的是CRITICAL_SECTION来实现实现临界区相关机制。

临界区使用相关函数:

void InitializeCriticalSection(LPCRITICAL_SECTION lpCriticalSection) // 初始化临界区

void EnterCriticalSection(LPCRITICAL_SECTION lpCriticalSection) // 进入临界区

void LeaveCriticalSection(LPCRITICAL_SECTION lpCriticalSection) // 离开临界区

void DeleteCriticalSection(LPCRITICAL_SECTION lpCriticalSection) // 释放临界区资源

事件

事件,相当于嵌入式中断触发的概念。

操作事件相关函数:

创建事件

HANDLE g_Event;

g_Event=CreateEvent(NULL,FALSE,FALSE,NULL);

等待事件

WaitForSingleObject(g_Event,INFINITE);

触发事件

SetEvent(g_Event);

销毁事件

CloseHandle(g_Event);

代码举例

long g_nNum;

unsigned int __stdcall Fun(void *pPM);

const int THREAD_NUM = 10;

//事件与关键段

HANDLE g_hThreadEvent;

CRITICAL_SECTION g_csThreadCode;

int main()

{

printf(” Event\n”);

printf(” — by MoreWindows( http://blog.csdn.net/MoreWindows ) –\n\n”);

//初始化事件和关键段 自动置位,初始无触发的匿名事件

g_hThreadEvent = CreateEvent(NULL, FALSE, FALSE, NULL);

InitializeCriticalSection(&g_csThreadCode);

HANDLE handle[THREAD_NUM];

g_nNum = 0;

int i = 0;

while (i < THREAD_NUM)

{

handle[i] = (HANDLE)_beginthreadex(NULL, 0, Fun, &i, 0, NULL);

WaitForSingleObject(g_hThreadEvent, INFINITE); //等待事件被触发

i++;

}

WaitForMultipleObjects(THREAD_NUM, handle, TRUE, INFINITE);

//销毁事件和关键段

CloseHandle(g_hThreadEvent);

DeleteCriticalSection(&g_csThreadCode);

return 0;

}

unsigned int __stdcall Fun(void *pPM)

{

int nThreadNum = *(int *)pPM;

SetEvent(g_hThreadEvent); //触发事件

Sleep(50);//some work should to do

EnterCriticalSection(&g_csThreadCode);

g_nNum++;

Sleep(0);//some work should to do

printf(“线程编号为%d 全局资源值为%d\n”, nThreadNum, g_nNum);

LeaveCriticalSection(&g_csThreadCode);

return 0;

}

线程设计

在视觉系统软件设计中,图像采集和图像处理各自拥有独立线程,相机采集的图片如果需要做图像处理,将会设置相应的flag标识,相应的图像处理线程检测到该标识,将执行相应的图像处理程序。

图像处理线程由一系列图像处理工具链接而成,可以通过任务链的方式依次完成图像处理工作。因此需要统一每个算法工具输入输出接口。

小结

多线程设计会使得程序结构更加清晰,程序运行效率更加高效。但是,务必要处理好线程同步的问题,保护好内存共享区。如果这方面处理不好,程序非常容易锁死。

免责声明:本站所有文章内容,图片,视频等均是来源于用户投稿和互联网及文摘转载整编而成,不代表本站观点,不承担相关法律责任。其著作权各归其原作者或其出版社所有。如发现本站有涉嫌抄袭侵权/违法违规的内容,侵犯到您的权益,请在线联系站长,一经查实,本站将立刻删除。 本文来自网络,若有侵权,请联系删除,如若转载,请注明出处:https://yundeesoft.com/39180.html

(0)

相关推荐

发表回复

您的电子邮箱地址不会被公开。 必填项已用 * 标注

关注微信