zoukankan      html  css  js  c++  java
  • 多线程 简单例子 windows ------(一)

    线程创建CreateThread()、【建议MS运行时库api _beginthreadex()】

    HANDLE WINAPI CreateThread(

        LPSECURITY_ATTRIBUTES   lpThreadAttributes, //线程安全相关的属性,常置为NULL

        SIZE_T                  dwStackSize,        //新线程的初始化栈在大小,可设置为0

        LPTHREAD_START_ROUTINE  lpStartAddress,     //被线程执行的回调函数,也称为线程函数

        LPVOID                  lpParameter,        //传入线程函数的参数,不需传递参数时为NULL

        DWORD                   dwCreationFlags,    //控制线程创建的标志  立即执行or暂时挂起

        LPDWORD                 lpThreadId          //传出参数,用于获得线程ID,如果为NULL则不返回线程ID

    );

    创建A,B两个线程,然后打印ThreadDemo类里面的名字以及数量,加了锁

    按照顺序打印,若未同步则乱序。

    多线程使用过程需要注意,线程安全。

    #include <iostream>
    #include <stdlib.h>
    #include <windows.h>
    #include <string.h>
    #include <vector>
    #include <mutex>
    #include <process.h>
    using namespace std;

    #define MY_GUID "040fb37a-b2e1-494e-aa4e-c0044b2b767c"

    //线程同步问题【线程同步】
    #define NAME_LENGTH 40


    HANDLE g_hMutex = NULL; //互斥量

    class ThreadDemo{
    public:
      ThreadDemo():nMaxNum(0) {
        strcpy_s(strThreadName,strlen(strThreadName),"");
      }

      int nMaxNum;
      char strThreadName[NAME_LENGTH];
    };

    DWORD WINAPI ThreadProc(LPVOID lpParameter)
    {

      DWORD error = 0; 
      ThreadDemo *pThreadData = static_cast<ThreadDemo*> (lpParameter);
      for (int i = 0; i < pThreadData->nMaxNum; ++i)
      {
        error  = WaitForSingleObject(g_hMutex, INFINITE);//无限等待这个锁,等到了执行,等不到不执行下面的

        //可以从error判断是否等到了
        cout << pThreadData->strThreadName << ": " << i << endl;
        Sleep(100);

        //释放互斥量锁
        ReleaseMutex(g_hMutex);
      }
      return 0;
    }
    int main(int argc, char *argv[])
    {

      //创建一个互斥量

      g_hMutex = CreateMutex(NULL, FALSE, MY_GUID);

      ThreadDemo threadData, threadIndex;
      threadData.nMaxNum = 5;
      strcpy_s(threadData.strThreadName, _countof(threadData.strThreadName),"Thread_1");

      threadIndex.nMaxNum = 10;
      strcpy_s(threadIndex.strThreadName, _countof(threadIndex.strThreadName), "Thread_2");

      HANDLE DataThread = CreateThread(NULL, 0,ThreadProc, &threadData, 0, NULL);
      HANDLE IndexThread = CreateThread(NULL, 0, ThreadProc, &threadIndex, 0, NULL);

      CloseHandle(DataThread);
      CloseHandle(IndexThread);


      for (int num = 0; num < 10; ++num) {  
        WaitForSingleObject(g_hMutex, INFINITE);//无限等待这个锁,等到了执行,等不到不执行下面的
        cout << "main thread is: " << num << endl;

        Sleep(100);
        //释放互斥量锁
        ReleaseMutex(g_hMutex);
      }

      system("pause");
      return 0;
    }

  • 相关阅读:
    为什么说2013是PHP年
    wordpress 投稿插件 支持图片上传
    php简易页面内调试技巧
    WordPress中文文档
    百度网盘文件直链
    HOWTO:如何解决安装包在系统“添加/删除”中无法修复或卸载的问题
    InstallShield 2008 终止声明 (EOL)对最终客户意味着什么
    InstallShield 2011新功能试用(10) Express版本
    AdminStudio 9.5 Service Pack 3
    INFO:InstallShield中安装路径变量的区别
  • 原文地址:https://www.cnblogs.com/liuruoqian/p/12309129.html
Copyright © 2011-2022 走看看