c++一个简单的线程

      C++本身并没有提供任何多线程机制,但是在windows下,我们可以调用SDK win32 api来编写多线程的程序

MSDN中CreateThread原型:
1
2
3
4
5
6
7
8
HANDLECreateThread(
 LPSECURITY_ATTRIBUTESlpThreadAttributes, //SD
 SIZE_TdwStackSize, //initialstacksize
 LPTHREAD_START_ROUTINElpStartAddress, //threadfunction
 LPVOIDlpParameter, //threadargument
 DWORDdwCreationFlags, //creationoption
 LPDWORDlpThreadId //threadidentifier
);
参数的意义:
1 lpThreadAttributes:指向SECURITY_ATTRIBUTES型态的结构的指针。在Windows 98中忽略该参数。
在Windows NT中,NULL使用默认安全性,不可以被子线程继承, 否则需要定义一个结构体将
它的bInheritHandle成员初始化为TRUE
2 dwStackSize,设置初始栈的大小,以字节为单位,如果为0,
那么默认将使用与调用该函数的线程相同的栈空间大小。
任何情况下 Windows根据需要动态延长堆栈的大小。
3 lpStartAddress,指向线程函数的指针,形式:@函数名,函数名称没有限制,但是必须以下列形式声明:
DWORD WINAPI 函数名 (LPVOID lpParam) ,格式不正确将无法调用成功。
也可以直接调用void类型
但lpStartAddress要这样通过LPTHREAD_START_ROUTINE转换如:
(LPTHREAD_START_ROUTINE)MyVoid
然后在线程声明为:
void MyVoid()
{
return;
}
4 lpParameter:向线程函数传递的参数,是一个指向结构的指针,不需传递参数时,为NULL。
5 dwCreationFlags :线程标志,可取值如下
(1)CREATE_SUSPENDED(0x00000004):创建一个挂起的线程,
(2)0:表示创建后立即激活。
(3)STACK_SIZE_PARAM_IS_A_RESERVATION(0x00010000):
dwStackSize参数指定初始的保留堆栈的大小,
否则,dwStackSize指定提交的大小。该标记值在 Windows 2000/NT and Windows Me/98/95上不支持。
6   lpThreadId:保存新线程的id。 返回值:  
      函数成功,返回线程句柄;函数失败返回false。
     若不想返回线程ID,设置值为NULL。
函数说明
创建一个线程。
语法:
hThread = CreateThread (&security_attributes, dwStackSize, ThreadProc,pParam, dwFlags, &idThread) ;
一般并不推荐使用 CreateThread函数,而推荐使用RTL 库里的System单元中定义的 BeginThread函数,因为这除了能创建一个线程和一个入口函数以外,还增加了几项保护措施。
在MFC程序中,应该调用AfxBeginThread函数,在 Visual C++程序中应调用_beginthreadex函数。

一个简单的线程例子:
// NamespaceTest.cpp : 定义控制台应用程序的入口点。
//

#include "stdafx.h"



DWORD WINAPI Fun(LPVOID lpParamter)
{
	while(1)
	{
		printf("hello\n");
		Sleep(1000);
	}
}
int _tmain(int argc, _TCHAR* argv[])
{
	
	
	
	HANDLE hTread = CreateThread(NULL,0,Fun,NULL,0,NULL);
	CloseHandle(hTread);
	
	while(1)
	{
		printf("wang wang \n");
		Sleep(100);
	}


	return 0;
}




<think>我们正在使用C++实现一个简单线程。根据引用,我们可以使用C++11标准引入的<thread>库,或者使用Qt框架的QThread。用户要求简单线程实现,我们提供两种常见方式:纯C++11标准和Qt实现(如果用户提到Qt则用,否则默认标准C++)。由于用户没有明确环境,这里以标准C++11为例,因为这是标准且跨平台。引用[1]提到C++11引入了线程库,引用[2]也提到了标准线程库。因此,我们将使用<thread>头文件。步骤:1.包含头文件<thread>和<iostream>(用于输出)。2.定义一个函数,作为线程的入口点。3.在main函数中,创建一个std::thread对象,传入该函数。4.调用join()等待线程完成。注意:线程在创建后立即开始执行。示例代码:```cpp#include<iostream>#include<thread>//线程将执行的函数voidthreadFunction(){std::cout<< "Hellofromthread!\n";}intmain(){//创建线程并启动,传入函数指针std::threadt(threadFunction);//主线程等待新线程结束t.join();std::cout<< "Mainthreadcontinues...\n";return0;}```这个程序将输出:```Hellofromthread!Mainthreadcontinues...```如果不想等待线程,可以调用detach(),但要注意线程的资源管理。另外,引用[3]提供了Qt多线程的示例,如果用户使用Qt,我们可以使用QThread。但是用户问题中没有提到Qt,所以我们提供标准C++的示例。根据引用[4],还有基于事件的多线程,但这里用户要求简单线程,所以我们不展开事件驱动。§§相关问题§§1.C++11中如何传递参数给线程函数?2.如何避免多线程中的数据竞争?3.C++线程中互斥锁(mutex)的使用方法?</think> ### C++ 简单线程实现示例 以下是使用 **C++11 标准线程库** 的简单线程实现代码: ```cpp #include <iostream> #include <thread> // 线程执行函数 void threadTask() { std::cout << "Thread started! Thread ID: " << std::this_thread::get_id() << std::endl; // 模拟耗时操作 for (int i = 0; i < 3; ++i) { std::cout << "Working... " << i + 1 << "/3" << std::endl; std::this_thread::sleep_for(std::chrono::seconds(1)); // 休眠1秒 } std::cout << "Thread finished!" << std::endl; } int main() { std::cout << "Main thread ID: " << std::this_thread::get_id() << std::endl; // 创建并启动线程 std::thread myThread(threadTask); std::cout << "Main thread is running..." << std::endl; // 等待线程完成 myThread.join(); std::cout << "Main thread continues after join." << std::endl; return 0; } ``` #### 关键点说明: 1. **`#include <thread>`**:C++11标准线程头文件[^1] 2. **`std::thread`**:线程类,构造函数接受线程函数 3. **`std::this_thread::sleep_for`**:线程休眠函数 4. **`join()`**:阻塞主线程直到工作线程完成[^2] #### 输出示例: ``` Main thread ID: 140737345521472 Main thread is running... Thread started! Thread ID: 140737336178368 Working... 1/3 Working... 2/3 Working... 3/3 Thread finished! Main thread continues after join. ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值