柳城网站建设,免费网址域名,导师微信赚钱只投资10元,大方县住房城乡建设局网站目录
一、创建线程的几种方法
1、使用POSIX线程库#xff08;pthread)#xff08;C#xff09;
2、 使用Windows线程库#xff08;Win32 API#xff09;#xff08;C#xff09;
3、使用C11标准库
二、线程的应用#xff08;常用实例#xff0c;附上完整代码pthread)C
2、 使用Windows线程库Win32 APIC
3、使用C11标准库
二、线程的应用常用实例附上完整代码
1、CreateThread创建线程的实例 一、创建线程的几种方法
在C/C中有多种方法可以创建线程以下列出了其中几种常用的方法
1、使用POSIX线程库pthread)C POSIX线程库是一套用于多线程编程的标准库在大部分类UNIX系统上都可以使用。可以使用pthread_create()函数来创建线程。
// C
#include pthread.hvoid *threadFunc(void *arg) {// 线程的代码逻辑return NULL;
}int main() {pthread_t tid;pthread_create(tid, NULL, threadFunc, NULL);// 主线程的代码逻辑pthread_join(tid, NULL); // 等待子线程执行完毕return 0;
}
2、 使用Windows线程库Win32 APIC 在Windows操作系统上可以使用Win32 API来创建线程。可以使用CreateThread()函数来创建线程。
1CreateThread()的原型为 HANDLE CreateThread( LPSECURITY_ATTRIBUTES lpThreadAttributes, SIZE_T dwStackSize, LPTHREAD_START_ROUTINE lpStartAddress, LPVOID lpParameter, DWORD dwCreationFlags, LPDWORD lpThreadId ); 参数说明 lpThreadAttributes线程的安全属性默认为NULL。dwStackSize线程堆栈的大小默认为0表示使用默认的堆栈大小。lpStartAddress线程的入口函数地址可以是一个函数指针或者线程函数的名字。lpParameter传递给线程函数的参数。dwCreationFlags线程的创建标志可以设置一些额外的选项如CREATE_SUSPENDED创建后暂停等。lpThreadId用于接收线程ID的指针。 CreateThread函数创建一个新的线程并返回一个指向线程的句柄。通过这个句柄可以对线程进行一些操作如等待线程结束、挂起或恢复线程等。
2下面是一个简单的示例演示如何使用CreateThread创建一个新的线程
// c
#include windows.hDWORD WINAPI threadFunc(LPVOID lpParam) {// 线程的代码逻辑return 0;
}int main() {HANDLE hThread CreateThread(NULL, 0, threadFunc, NULL, 0, NULL);// 主线程的代码逻辑WaitForSingleObject(hThread, INFINITE); // 等待子线程执行完毕CloseHandle(hThread);return 0;
}
3、使用C11标准库 在C11标准中引入了std::thread类可以方便地创建和管理线程。
// c
#include threadvoid threadFunc() {// 线程的代码逻辑
}int main() {std::thread t(threadFunc); // 创建线程// 主线程的代码逻辑t.join(); // 等待子线程执行完毕return 0;
}
4、AfxBeginThread MFC AfxBeginThread 是一个 MFCMicrosoft Foundation Class函数用于创建一个新的线程。它的含义是在应用程序中启动一个新的线程以便在后台执行一些任务而不会阻塞主线程的运行。 AfxBeginThread 函数的原型如下 CWinThread* AfxBeginThread( AFX_THREADPROC pfnThreadProc, LPVOID pParam, int nPriority THREAD_PRIORITY_NORMAL, UINT nStackSize 0, DWORD dwCreateFlags 0, LPSECURITY_ATTRIBUTES lpSecurityAttrs NULL ); 参数说明 pfnThreadProc指向线程函数的指针该线程函数将在新线程中执行。pParam传递给线程函数的参数。nPriority新线程的优先级默认为 THREAD_PRIORITY_NORMAL。nStackSize新线程的堆栈大小默认为 0表示使用默认堆栈大小。dwCreateFlags创建线程的标志默认为 0。lpSecurityAttrs线程安全属性默认为 NULL。 AfxBeginThread 函数将返回一个 CWinThread 对象的指针可以使用该指针来管理和控制新线程的行为如等待线程结束、获取线程ID等。 总之AfxBeginThread 函数用于创建一个新的线程并在新线程中执行指定的函数以实现多线程编程。 实例
// 声明一个变量继承于CWinThread
UINT ReceiveMsgThreadID;
CThreadReceiveRespMsg *pThreadReceiveMsg;//启动线程
pThreadReceiveMsg (CThreadReceiveRespMsg *)::AfxBeginThread(RUNTIME_CLASS(CThreadReceiveRespMsg), THREAD_PRIORITY_NORMAL);
if (pThreadReceiveMsg ! NULL)
{log(_T(线程1启动成功 \n));ReceiveMsgThreadID pThreadReceiveMsg-m_nThreadID;
}
else
{log(_T(线程1启动失败 \n));
}以上是几种常用的创建线程的方法选择哪种方法取决于你的需求和运行环境。
二、线程的应用常用实例附上完整代码
1、CreateThread创建线程的实例
// 头文件
#pragma once
#include singleton.h
#include windows.hclass CThreadBase
{
public:CThreadBase(void);virtual ~CThreadBase(void);public:// 开启线程void vStart();// 结束线程virtual void vStop();// 线程是否可运行virtual bool isCanRun();// 子类重写此函数用于接收线程逻辑virtual int circle();// 入锁、解锁临界区不同的编译环境修改成其他的同步条件即可void _lock();void _unLock();protected:DWORD m_dThreadId; // 线程ID bool m_bCanRun; // 是否可以运行int m_nThreadHandle; // 线程句柄#ifdef WINVERCRITICAL_SECTION m_criSection; // 临界区定义一个需要数据同步的自取即可
#endif
};// 源文件
#include ThreadBase.h
//#include afxwin.h// 线程函数
DWORD WINAPI threadProc(LPVOID pArgs)
{if (0 pArgs)return 0;CThreadBase* pThreadBase (CThreadBase*)pArgs;pThreadBase-circle();return 0;
}CThreadBase::CThreadBase(void)
{m_bCanRun false;m_dThreadId 0;m_nThreadHandle NULL;#ifdef WINVERInitializeCriticalSection(m_criSection);
#endif
}CThreadBase::~CThreadBase(void)
{
}void CThreadBase::vStart()
{m_nThreadHandle (int)CreateThread(NULL, 0, threadProc, this, 0, m_dThreadId);m_bCanRun true;
}void CThreadBase::vStop()
{m_bCanRun false;
}bool CThreadBase::isCanRun()
{return m_bCanRun;
}int CThreadBase::circle()
{return TRUE;
}void CThreadBase::_lock()
{
#ifdef WINVEREnterCriticalSection(m_criSection);
#endif
}void CThreadBase::_unLock()
{
#ifdef WINVERLeaveCriticalSection(m_criSection);
#endif
}
使用时候
1直接继承这个类子类重写circle() 这个函数即可这个函数用于接收线程的逻辑
2想让线程执行的功能可以写在子类的circle()中