首页 > Windows驱动开发 > 事件 互斥对象 信号量

事件 互斥对象 信号量

看《Windows驱动开发技术详解》,第八章了,看到用户态同步处理。照抄了几段代码,关于事件、互斥对象、信号量。
以前写过入门级别的多线程,差不多忘了一干二净了。
还有,如果代码有编译错误请参考上一篇文章予以解决。
O(∩_∩)O~代码仅供娱乐之用。接下来该看内核模式下的同步处理了。

                      占                         位                        专                            用                           
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
// Event的,如果编译错误请参考上一篇文章
#include <windows.h>
#include <process.h>
#include <stddef.h>
#include <stdlib.h>
#include <conio.h>
#include <stdio.h>
 
UINT WINAPI Thread1(LPVOID para)
{
	printf("Enter Thread1\n");
	HANDLE *phEvent = (HANDLE *)para;
	SetEvent(*phEvent);
	printf("Leave Thread1\n");
	return 0;
}
 
int main(int argc, char **argv)
{
	HANDLE hEvent = CreateEvent(NULL, FALSE, FALSE, NULL);
	HANDLE hThread1 = (HANDLE)_beginthreadex(NULL, 0, Thread1, &hEvent, 0, NULL);
	CloseHandle(hThread1);
	WaitForSingleObject(hEvent, INFINITE);
 
	return 0;
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
// Mutex的,如果编译错误请参考上一篇文章
#include <windows.h>
#include <process.h>
#include <stdio.h>
 
UINT WINAPI Thread1(LPVOID para)
{
	HANDLE *phMutex = (HANDLE *)para;
	WaitForSingleObject(*phMutex, INFINITE);
	// 多次获得互斥体,感觉没有任何意义
	WaitForSingleObject(*phMutex, INFINITE);
	printf("Enter Thread1\n");
	Sleep(2000);
	printf("Leave Thread1\n");
	ReleaseMutex(*phMutex);
 
	return 0;
}
 
UINT WINAPI Thread2(LPVOID para)
{
	HANDLE *phMutex = (HANDLE *)para;
	WaitForSingleObject(*phMutex, INFINITE);
	printf("Enter Thread2\n");
	Sleep(2000);
	printf("Leave Thread2\n");
	ReleaseMutex(*phMutex);
 
	return 0;
}
 
int main()
{
	HANDLE hMutex = CreateMutex(NULL, FALSE, NULL);
	HANDLE hThread1 = (HANDLE)_beginthreadex(NULL, 0, Thread1, &hMutex, 0, NULL);
	HANDLE hThread2 = (HANDLE)_beginthreadex(NULL, 0, Thread2, &hMutex, 0, NULL);
 
	Sleep(6000);
	return 0;
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
// Semaphore的,如果编译错误请参考上一篇文章。无聊加了个翻转的东东在里面
#include <windows.h>
#include <process.h>
#include <stdio.h>
 
char playproc[] = "|/-\\ ";
//上面一句为了不让代码高亮RSS误解在最后加了空格
//所以注释了下面一句,对程序不产生影响
//char playproc[] = {'|', '/', '-', '\\'};
int idx = 0;
 
UINT WINAPI Thread1(LPVOID para)
{
	HANDLE *phSemaphore = (HANDLE *)para;
	printf("\b%c", playproc[(idx++)%4]);
	Sleep(500);
	ReleaseSemaphore(*phSemaphore, 1, NULL);
	return 0;
}
 
int main(int argc, char **argv)
{
	HANDLE hSemaphore = CreateSemaphore(NULL, 2, 2, NULL);
	WaitForSingleObject(hSemaphore, INFINITE);
	WaitForSingleObject(hSemaphore, INFINITE);
 
	for (int i = 0; i < 100; ++i)
	{
		HANDLE hThread1 = (HANDLE)_beginthreadex(NULL, 0, Thread1, &hSemaphore, 0, NULL);
		WaitForSingleObject(hSemaphore, INFINITE);
	}
 
	return 0;
}

觉得文章还不错?点击此处对作者进行打赏!


本文地址: 程序人生 >> 事件 互斥对象 信号量
作者:代码疯子(Wins0n) 本站内容如无声明均属原创,转载请保留作者信息与原文链接,谢谢!


更多



  1. 2011年1月4日14:10 | #1

    看到代码,我头都会晕
    幸好还有你们
    嘿嘿!
    继续努力!

    [回复]

  2. 2011年1月6日18:07 | #2

    ccc,全是C

    [回复]

  3. 2011年1月16日13:51 | #3

    多线程不用,很容易忘的。

    [回复]

  4. 2011年1月16日13:56 | #4

    最初学的时候,觉得在控制台里写多线程实在觉得太简单,后来移到窗口程序里面去,就完全不会了,囧

    [回复]

    代码疯子 回复:

    是的 在控制台写的代码都比较简单吧 转到GUI要考虑程序的灵活性

    [回复]