建立线程(使用信号量Semaphore同步,输出有序)
#include<stdio.h>
#include<process.h>
#include<windows.h>
long g_nNum;
unsigned int __stdcall Fun(void *pPM);
//事件与临界区
HANDLE g_hThreadParameter;
CRITICAL_SECTION g_csThreadCode;
int main()
{
HANDLE handle[10];
int i=0;
g_nNum=0;
printf(" 线程同步 信号量Semaphore\n");
//初始化信号量Semaphore和临界区
g_hThreadParameter=CreateSemaphore(NULL,0,1,NULL);
//当前0个资源,最大允许1个同时访问
InitializeCriticalSection(&g_csThreadCode);
while(i<10)
{
handle[i]=(HANDLE)_beginthreadex(NULL,0,Fun,&i,0,NULL);
WaitForSingleObject(g_hThreadParameter,INFINITE);//等待信号量>0
i++;
}
WaitForMultipleObjects(10,handle,TRUE,INFINITE);
DeleteCriticalSection(&g_csThreadCode);
//撤销事件和临界区
CloseHandle(g_hThreadParameter);
for(i=0;i<10;i++)
{
CloseHandle(handle[i]);
}
return 0;
}
unsigned int __stdcall Fun(void *pPM)
{
int nThreadNum=*(int *)pPM;
ReleaseSemaphore(g_hThreadParameter,1,NULL);//信号量+1
Sleep(50);//休眠50ms
EnterCriticalSection(&g_csThreadCode);
g_nNum++;
Sleep(0);
printf("线程编号为%d 全局资源值为%d\n",nThreadNum,g_nNum);
LeaveCriticalSection(&g_csThreadCode);
Sleep(10000);
return 0;
}
建立线程(互斥信号量用于进程间互斥)
控制台应用程序1
#include<stdio.h>
#include<process.h>
#include<windows.h>
#include<conio.h>
const char MUTEX_NAME[]="Mutex_MoreWindows";
int main()
{
char c;
HANDLE hMutex=CreateMutex(NULL,TRUE,MUTEX_NAME);
printf("互斥量已创建,现在按任意键触发互斥量\n");
c=getch();
if(c=='e')
exit(0);
else
{
ReleaseMutex(hMutex);
printf("互斥量已经触发");
}
CloseHandle(hMutex);
return 0;
}
控制台应用程序2
#include<stdio.h>
#include<process.h>
#include<windows.h>
#include<conio.h>
const char MUTEX_NAME[]="Mutex_MoreWindows";
int main()
{
HANDLE hMutex;
DWORD dwResult;
hMutex=OpenMutex(MUTEX_ALL_ACCESS,TRUE,MUTEX_NAME);
if(hMutex==NULL)
{
printf("打开互斥量失败\n");
return 0;
}
printf("等待中......\n");
dwResult=WaitForSingleObject(hMutex,10*1000);
switch(dwResult)
{
case WAIT_ABANDONED:
printf("拥有互斥量的进程意外终止\n");
break;
case WAIT_OBJECT_0:
printf("已收到信号\n");
break;
case WAIT_TIMEOUT:
printf("信号未在规定的时间内送到\n");
break;
}
CloseHandle(hMutex);
return 0;
}
查看磁盘
![在这里插入图片描述](https://img-blog.csdnimg.cn/d8a5d687f39f4731808167e7a7553dcf.png)