线程

作者: Lavinci | 来源:发表于2018-02-10 15:07 被阅读0次

线程管理

线程创建

#include <stdio.h>
#include <windows.h>


DWORD WINAPI ThreadProc(LPVOID lpParam)
{
    int i=0;
    
    while(i<20)
    {
        printf("I am form a thread,count= %d \n",i++);
    }
    return 0;
}


int main(int argc,char* argv[])
{
    HANDLE hThread;  
    DWORD dwThreadId;


    hThread = ::CreateThread(NULL,NULL,ThreadProc,NULL,0,&dwThreadId);
    printf("Id = %d \n",dwThreadId);

    ::WaitForSingleObject(hThread,INFINITE);        //等待线程结束
    ::CloseHandle(hThread);                     //关闭句柄

    return 0;
}

优先级管理

线程之间存在优先级问题,如下解决

#include <windows.h>
#include <stdio.h>

DWORD WINAPI ThreadIdle(LPVOID lpParam)
{
    int i=0;
    while(i++<10)
        printf("Idle Thread runing \n");

    return 0;
}

DWORD WINAPI ThreadNormal(LPVOID lpParam)
{
    int i=0;
    while(i++ < 10)
        printf("Normal Thread runing \n");

    return 0;
}

int main(int argc,char* argv[])
{
    DWORD dwThreadId;
    HANDLE h[2];

    h[0]=::CreateThread(NULL,0,ThreadIdle,NULL,CREATE_SUSPENDED,&dwThreadId);   //暂停态线程
    ::SetThreadPriority(h[0],THREAD_PRIORITY_IDLE);         //优先级(空闲)
    ::ResumeThread(h[0]);

    h[1]=::CreateThread(NULL,0,ThreadNormal,NULL,0,&dwThreadId);    //默认的Normal

    ::WaitForMultipleObjects(2,h,TRUE,INFINITE);        //等待多线程结束


    ::CloseHandle(h[0]);
    ::CloseHandle(h[1]);

    return 0;
}

线程同步

多个线程同时访问一段数据,会产生奇怪的问题,由此引入临界区
可把注释部分删除观察现象

#include <windows.h>
#include <stdio.h>
#include <process.h>

int g_nCount1=0;
int g_nCount2=0;

BOOL g_bContinue=TRUE;
CRITICAL_SECTION g_cs;

UINT _stdcall ThreadFunc(LPVOID);

int main(int argc,char* argv[])
{
    UINT uId;
    HANDLE h[2];

    ::InitializeCriticalSection(&g_cs); //临界区声明

    h[0]=(HANDLE)::_beginthreadex(NULL,0,ThreadFunc,NULL,0,&uId);
    h[1]=(HANDLE)::_beginthreadex(NULL,0,ThreadFunc,NULL,0,&uId);
    
    Sleep(1000);
    g_bContinue=FALSE;

    ::WaitForMultipleObjects(2,h,TRUE,INFINITE);



    ::CloseHandle(h[1]);
    ::CloseHandle(h[2]);
    ::DeleteCriticalSection(&g_cs);     删除临界区

    printf("gCount1= %d\n",g_nCount1);
    printf("gCount2= %d\n",g_nCount2);

    return 0;
}

UINT _stdcall ThreadFunc(LPVOID)
{
    while(g_bContinue)
    {
        ::EnterCriticalSection(&g_cs);      //进入临界区
        g_nCount1++;
        g_nCount2++;
        ::LeaveCriticalSection(&g_cs);      //离开临界区
    }

    return 0;
}

相关文章

  • Android

    线程间通信 主线程和工作线程主线程和工作线程 工作线程与工作线程工作线程与工作线程 为什么主线程Looper.lo...

  • 三、操作系统之线程

    前言 什么是线程 引入线程的原因 线程的概念 线程和进程的关系 线程结构 线程有点 多线程模型 用户线程和内核线程...

  • Thread

    队列 线程锁 多线程,线程池 队列 多线程爬虫示例 多线程 自定义线程 线程池

  • 总结多线程与设计模式+synchronized+性能+高吞吐+死

    Java线程 Java语言的线程 何谓线程 线程启动 线程的暂时停止 线程的共享互斥 线程的协调 线程的状态转移 ...

  • 多线程编程

    摘要 线程概念,线程与进程的区别与联系学会线程控制,线程创建,线程终止,线程等待了解线程分离与线程安全学会线程同步...

  • java线程池

    线程VS线程池 普通线程使用 创建线程池 执行任务 执行完毕,释放线程对象 线程池 创建线程池 拿线程池线程去执行...

  • java并发之守护线程

    java中有两种线程,用户线程和守护线程用户线程:主线程停止时,用户线程不会停止守护线程:主线程停止时,守护线程也...

  • Java线程池的使用

    线程类型: 固定线程 cached线程 定时线程 固定线程池使用 cache线程池使用 定时调度线程池使用

  • 线程基础知识

    线程学习 线程的基础知识 线程是什么? 线程和进程的关系 线程的6个状态 线程优先级 主线程、多线程、后台线程的概...

  • 多线程介绍

    一、进程与线程 进程介绍 线程介绍 线程的串行 二、多线程 多线程介绍 多线程原理 多线程的优缺点 多线程优点: ...

网友评论

      本文标题:线程

      本文链接:https://www.haomeiwen.com/subject/kvmgzxtx.html