多线程 学习笔记<1> 线程建立

本文是多线程学习笔记的第一部分,主要探讨如何建立线程。通过示例代码,展示了线程的安全属性、堆栈大小、线程函数、参数传递以及线程标志等关键概念。同时,提供了传递参数的线程创建示例,帮助读者理解不同线程创建方式的差异。
摘要由CSDN通过智能技术生成

先看下面一个例子

//Tread.cpp

#include <iostream>
#include <cstdlib>

using namespace std;

#include <Windows.h>
#include <process.h>

unsigned _stdcall ThreadProc1(void* param);
unsigned _stdcall ThreadProc2(void* param);

int main()
{
	 HANDLE handle1 = (HANDLE)_beginthreadex(NULL, 0, ThreadProc1, NULL, NULL, NULL);
	 HANDLE handle2 = (HANDLE)_beginthreadex(NULL, 0, ThreadProc2, NULL, NULL, NULL);

	 if ((handle1 == NULL) | (handle2 == NULL))
	 {
		  cout<<"create thread failed"<<endl;
		  system("pause");
		  return 0;
	 }
	 WaitForSingleObject(handle1, INFINITE);
	 cout<<"Thread1 is over"<<endl;

	 WaitForSingleObject(handle2, INFINITE);	 
	 cout<<"Thread2 is over"<<endl;

	 CloseHandle(handle1);
	 CloseHandle(handle2);
	 system("pause");
	 return 0;
}

unsigned _stdcall ThreadProc1(void* param)
{
	for(int i=0; i<3; i++)
	{
		 cout<<"_beginthreadex create thread___1"<<endl;
		 Beep(1000,500);
	}
	 return 0;
}

unsigned _stdcall ThreadProc2(void* param)
{
	for(int i=0; i<6; i++)
	{
		 cout<<"_beginthreadex create thread___2"<<endl;
		 Beep(1000,500);
	}
	 return 0;
}

_beginthreadx 参数依次为

安全属性,默认为NULL

线程堆栈大小,默认为0,表示同父线程

线程函数名,线程任务

线程参数,此处为NULL,若有参数建议结构体传递

线程标志,0(NULL)或者CREATE_SUSPEND 立即执行或者创建后挂起

线程ID,不用的话可以为NULL




下面是另一个传递参数的线程例子。

对比可以发现一些现成的书写特点。


Thread.cpp

#include <Windows.h>
#include <process.h>
#include <iostream>
#include <cstdlib>

using namespace std;

struct ThreadInfo
{
	int param;
};

unsigned _stdcall ThreadProc(void* param)
{
	ThreadInfo * Info = (ThreadInfo*)param;
	int count = Info->param;
	for(int i=0; i<count; i++)
	{
		 cout<<"_beginthreadex create thread"<<endl;
		 cout<<"The Thread ID is"<<GetCurrentThreadId()<<endl;
		 Beep(1000,500);
	}
	 return 0;
}

int main()
{
	 HANDLE handle;
	 DWORD ThreadID;
	 ThreadInfo Info;
         Info.param = 5;

	 handle = (HANDLE)_beginthreadex(NULL, 0, &ThreadProc, &Info, 0, (unsigned *)&ThreadID);

	 if (handle == NULL)
	 {
		  cout<<"create thread failed"<<endl;
		  system("pause");
		  return 0;
	 }
	 WaitForSingleObject(handle, INFINITE);
	 cout<<"Thread is over"<<endl;
	 CloseHandle(handle);
	 system("pause");
	 return 0;
}






额,这个还是没用到线程 ID。但是得到了。



  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值