18.C语言多线程总结

  • 创建一个线程
    1 _beginthread(myfun, 0, NULL);//返回值是一个HANDLE
    1 hd[i] = CreateThread(NULL, 0, add, NULL, 0, NULL);//创建线程

     

  • 线程内部结束
    1 _endthread()

     

  • 外部暂停线程
    1 SuspendThread(hd[0]);

     

  • 外部恢复线程
    1 ResumeThread(hd[0]);

     

  • 外部结束一个线程
    1 ExitThread(th[0]);

     

  • 创建临界区
    1 CRITICAL_SECTION cs1;

    临界区支持的最大线程数为64

  • 初始化临界区
    1 InitializeCriticalSection(&cs1);

     

  • 进入临界区
    1 EnterCriticalSection(&cs1);

     

  • 离开临界区
    1 LeaveCriticalSection(&cs1);

     

一个示例,一百个线程每个线程对一个变量进行操作

 1 #include <stdio.h>
 2 #include <stdlib.h>
 3 #include <Windows.h>
 4 #define N 64//临界区最大线程64
 5 
 6 CRITICAL_SECTION cs1 ;//定义临界区
 7 
 8 
 9 int num = 0;//多线程访问会造成冲突,要用到临界区
10 
11 DWORD WINAPI myfun(void *p)
12 {
13     //进入临界区
14     EnterCriticalSection(&cs1);
15     for (int i = 0; i < 10000; i++)
16     {
17         num++;    
18     }
19     //离开临界区
20     LeaveCriticalSection(&cs1);
21     return 0;
22 }
23 
24 void main()
25 {
26     //初始化临界区
27     InitializeCriticalSection(&cs1);
28     //线程数组
29     HANDLE hd[N];
30     for (int i = 0; i < N; i++)
31     {
32         //数组每一个元素都是一个线程
33         //hd[i] = (HANDLE)_beginthread(myfun, 0, NULL);
34         hd[i]=CreateThread(NULL, 0, myfun, NULL, 0, NULL);
35         //WaitForSingleObject(hd[i], INFINITE);//等一个线程退出再执行
36     }
37     //等待所有的线程退出
38     WaitForMultipleObjects(N, hd, TRUE, INFINITE);
39 
40     printf("%d\n", num);
41 
42     //删除临界区
43     DeleteCriticalSection(&cs1);
44     system("pause");
45 }

 

posted @ 2018-02-02 16:11  喵小喵~  阅读(1125)  评论(0编辑  收藏  举报