API函数CreateThread可以用来创建一个线程。以下是函数的原型
在创建线程之后,需要线程来执行某些工作,这时候,执行的工作就交给上述的第三个参数 线程的函数来实现
线程函数的定义形势如下:
线程函数中的参数也就是创建进程函数中的第四个参数。
在创建线程时,就直接把参数传给线程函数了。
下面的一个例子来示例下线程的工作过程
}
DWORD WINAPI Shop1(LPVOID lpParameter)
{
//循环判断tickets,如果>0,表示票没有卖光
while (1)
{
if (tickets>0)
{
printf("Shop1 Sell a Ticket:%d/n",tickets);
tickets--;
}
else//卖光了就退出返回
{
return 0;
}
}
return 0;
}
DWORD WINAPI Shop2(LPVOID lpParameter)
{
//循环判断tickets,如果>0,表示票没有卖光
while (1)
{
if (tickets>0)
{
printf("Shop1 Sell a Ticket:%d/n",tickets);
tickets--;
}
else//卖光了就退出返回
{
return 0;
}
}
return 0;
}
其实很简单,就通过线程函数创建线程之后,再实现线程函数,就可以工作了。
----------------------------------------------------------
在多线程程序的执行过程中,多个线程会访问同一块数据,临街资源。为了避免他们同时访问,造成不确定的影响,需要将临街资源进行保护。完成这个过程就叫做线程同步。
我们可以用创建互斥对象来实现之
互斥资源的创建函数CreateMutex
具体的实现请看下面的例子:
////////////////////////////////////////////////////////////////////////
int main()
{
//////////////////////////////////////////////////////////////////////////
//在创建线程之前,先建立一个互斥对象,使用常用参数
g_hMutex=CreateMutex(
NULL,//不允许继承
FALSE,//创建线程放弃拥有权
NULL);//没有名字
//////////////////////////////////////////////////////////////////////////
//开启俩个线程开始售票
HANDLE hThread1=CreateThread(
NULL,//设置为null,表示不允许继承其句柄
0,//0表示由windows自动分配
Shop1,//指定的线程函数
NULL,//要传递给线程函数的参数
0,//如果想要线程创建以后挂起(也就是没有运行),需要设置成CREATE_SUSPENDED
NULL);//null表示不需要线程ID
HANDLE hThread2=CreateThread(NULL,0,Shop2,NULL,0,NULL);
//延时退出
Sleep(10000);
//减少应用计数
CloseHandle(Shop1);
CloseHandle(Shop2);
return 0;
}
DWORD WINAPI Shop1(LPVOID lpParameter)
{
//循环判断tickets,如果>0,表示票没有卖光
while (1)
{
//////////////////////////////////////////////////////////////////////////
/*WaitForSingleObject等待一个对象达到信号状态
当一个互斥对象的拥有者放弃其拥有权的时候
WaitForSingleObject调用成功以后的线程就是其所有权拥有者
必须是使用了ReleaseMutex或者线程结束之后,才会放弃对其拥有权
*/
WaitForSingleObject(
g_hMutex,//表示要等待的对象
INFINITE);//表示要等待的时间,infinite表示无限。。。
if (tickets>0)
{
Sleep(1);//延时,出线了tickets=0的情况,这是由于同时占用了临届资源。。
printf("Shop1 Sell a Ticket:%d/n",tickets);
tickets--;
}
else//卖光了就退出返回
{
return 0;
}
ReleaseMutex(g_hMutex);
}
return 0;
}
DWORD WINAPI Shop2(LPVOID lpParameter)
{
//循环判断tickets,如果>0,表示票没有卖光
while (1)
{
WaitForSingleObject(
g_hMutex,//表示要等待的对象
INFINITE);//表示要等待的时间,infinite表示无限。。。
if (tickets>0)
{
printf("Shop2 Sell a Ticket:%d/n",tickets);
tickets--;
}
else//卖光了就退出返回
{
return 0;
}
ReleaseMutex(g_hMutex);
}
return 0;
}
-------------------------------------
线程同步的方法除了互斥资源,还有其他的方法。其原理和方式都差不多。
线程的同步的时候,会调用一些方法来造成其他的线程进行等待。其实这里面也有隐患的。那就是由于某种原因,一直等待下去,造成死锁。
要避免死锁,就需要养成良好的编程规范,同时在设计上让程序合理。