• 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
    ", num);
    41 
    42     //删除临界区
    43     DeleteCriticalSection(&cs1);
    44     system("pause");
    45 }
  • 相关阅读:
    Wayland中的跨进程过程调用浅析
    设计模式总结
    C语言---整型字符串转换
    抽象工厂模式
    SVNclient安装与使用
    [置顶] MyEclipse下安装插件方法(properties文件编辑器Propedit为例)
    脑筋急转弯的歧义性
    脑筋急转弯的歧义性
    从和式积分到定积分
    从和式积分到定积分
  • 原文地址:https://www.cnblogs.com/xiaochi/p/8405678.html
Copyright © 2020-2023  润新知