THRDTERM产生两个线程。周期性地检查一个event对象。以决定要不要结束自己。

#define WIN32_LEAN_AND_MEAN

#include<stdio.h>

#include<windows.h>

#include<stdlib.h>

#include<time.h>

#include "MtVerify.h"





DWORD WINAPI ThreadFunc(LPVOID);

HANDLE hRequestExitEvent = FALSE;





int main()

{

HANDLE hThreads[2];

DWORD dwThreadId;

DWORD dwExitCode = 0;

int i;

hRequestExitEvent = CreateEvent(NULL, TRUE, FALSE, NULL);

for (i = 0; i < 2; i++)

{

MTVERIFY(hThreads[i] = CreateThread(NULL, 0, ThreadFunc,

(LPVOID)i, 0, &dwThreadId));

}

//wait around for a while, make sure the thread is running

Sleep(1000);

SetEvent(hRequestExitEvent);

WaitForMultipleObjects(2, hThreads, TRUE, INFINITE);



for (i = 0; i < 2; i++)

{

MTVERIFY(CloseHandle(hThreads[i]));

}





return EXIT_SUCCESS;

}

DWORD WINAPI ThreadFunc(LPVOID p)

{

int i;

int inside = 0;

UNREFERENCED_PARAMETER(p);

//seed the random-number generator

srand((unsigned)time(NULL));

for (i = 0; i < 1000000; i++)

{

double x = (double)(rand()) / RAND_MAX;

double y = (double)(rand()) / RAND_MAX;

if ((x*x + y*y) <= 1.0)

{

inside++;

}

if (WaitForSingleObject(hRequestExitEvent, 0) != WAIT_TIMEOUT)

{

printf("Received request to terminate\n");

return (DWORD)-1;

}

}

printf("PI=%.4g\n",(double)inside / i*4);

return 0;

}

THRDTERM-----干净地结束一个线程的更多相关文章

  1. 第5章 不要让线程成为脱缰的野马(Keeping your Threads on Leash) ---干净的终止一个线程

    干净的终止一个线程  我曾经在第2章产生一个后台线程,用以输出一张屏幕外的 bitmap 图.我们必须解决的一个最复杂的问题就是,如果用户企图结束程序,而这张bitmap 图尚未完成,怎么办?第2章的 ...

  2. C#如何优雅的结束一个线程

    大家都知道在C#里面,我们可以使用 Thread.Start方法来启动一个线程,当我们想停止执行的线程时可以使用Thread.Abort方法来强制停止正在执行的线程,但是请注意,你确定调用了Threa ...

  3. Thread 如何安全结束一个线程 MD

    Markdown版本笔记 我的GitHub首页 我的博客 我的微信 我的邮箱 MyAndroidBlogs baiqiantao baiqiantao bqt20094 baiqiantao@sina ...

  4. android 如何结束一个线程

    总结: 1 不推荐直接调用onstop()强制结束,,因为不安全 2 run()比较短暂,执行完毕会自动停止 3 在run()设置一个flag标识,满足条件才执行; 4 通过sleep()捕获异常,在 ...

  5. C# 启动和结束一个线程

    在程序执行中会遇到启动本软件的exe问,或者启用其它的exe文件,已达到执行某些操作的作用.下面是两种最常见的启动exe文件. 1.调用系统dll使用其提供的方法. 引用的dll, [DllImpor ...

  6. 第5章 不要让线程成为脱缰的野马(Keeping your Threads on Leash) ----初始化一个线程

    使用线程的一个常见问题就是如何能够在一个线程开始运行之前,适当地将它初始化.初始化最常见的理由就是为了调整优先权.另一个理由是为了在SMP 系统中设定线程比较喜欢的 CPU.第10 章谈到 MFC 时 ...

  7. Java 如何正确停止一个线程

    自己在做实验性小项目的时候,发现自己遇到一个问题:如何控制线程的"死亡"? 首先,如何开启一个线程呢? 最简单的代码: public class Main { public sta ...

  8. Java并发(基础知识)—— 创建、运行以及停止一个线程

    在计算机世界,当人们谈到并发时,它的意思是一系列的任务在计算机中同时执行.如果计算机有多个处理器或者多核处理器,那么这个同时性是真实发生的:如果计算机只有一个核心处理器那么就只是表面现象. 现代所有的 ...

  9. 对tomcat来说,每一个进来的请求(request)都需要一个线程,直到该请求结束。

    这段时间折腾了哈java web应用的压力测试,部署容器是tomcat 7.期间学到了蛮多散碎的知识点,及时梳理总结,构建良好且易理解的知识架构把它们组织起来,以备忘.对web应用开发者来说,我们很关 ...

随机推荐

  1. MySQL索引----数据结构及算法原理

    摘要 本文以MySQL数据库为研究对象,讨论与数据库索引相关的一些话题.特别需要说明的是,MySQL支持诸多存储引擎,而各种存储引擎对索引的支持也各不相同,因此MySQL数据库支持多种索引类型,如BT ...

  2. SV creation order

    SystemVerilog Instance Worlds When generating an UVM testbench and in particular the DUT - testbench ...

  3. webpack 打包后 Uncaught SyntaxError: Unexpected token <

    问题描述:npm run dev 没报错.是可以正常运行的, npm run build 过程也没报错, 但是打开dist   index.html  就报错了  错误内容:       解决方法: ...

  4. Redis系列(一)StackExchange.Redis的使用

    Redis系列(一)StackExchange.Redis的使用 一.DLL安装 用NuGet搜索StackExchange.Redis,然后下载就可以. ConnectionMultiplexer对 ...

  5. view.getParent()与view.getRootView()

    顾名思义,getParent就是获取view的父亲节点,而getRootView是寻找当前的view层次中处在最顶层的view,可理解为找出该view实例所在的view层次的根view. 如果这个vi ...

  6. u-boot常用命令

    查看ip地址等信息 print tftp相关 设置ip地址 set ipaddr 192.168.1.5 设置tftp所在电脑ip set serverip 192.168.1.8 最后必须输入sav ...

  7. pandas格式化str为时间,pandas将int转化为str

    code_300['HISTORY_DATE'] = code_300['HISTORY_DATE'].map(str)code_300['HISTORY_DATE'] = pd.to_datetim ...

  8. c++ map: 当map的value是void*指针

    #include <iostream> #include <map> #include <vector> using namespace std; //key is ...

  9. python利用7z批量解压rar

    一开始我使用了rarfile这个库,奈何对于含有密码的压缩包支持不好,在linux上不抛出异常:之后有又尝试了unrar..比rarfile还费劲.. 所以用了调用系统命令的方法,用7z来解压 通过a ...

  10. idea SSM里配置redis

    参考文章 https://blog.csdn.net/qq_17635843/article/details/78522776