两种模式多线程的解决方案[2004年4月29日 10:53]

原创 2004年07月11日 03:38:00

1.    规定线程数目

如:MSDN中一个多线程绘图的例子。

方法一:

范例是用两个Event

一个hKillEvent //主线程发到子线程 --我要你死了

   hDeadEvent //子线程发到主线程  --我已经死了。^_^

子线程中这样

if(WaitForSingleObject(pSubService->hKillEvent, 0) != WAIT_TIMEOUT)

{

   ::SetEvent(pSubService->hDeadEvent);

   退出线程

}

主线程中

对每个子线程循环

SetEvent(m_MainService.hKillEvent);

WaitForSingleObject(m_MainService.hDeadEvent, INFINITE);

 <?XML:NAMESPACE PREFIX = O />

方法二:用WaitForMultiObject

转自:http://expert.csdn.net/Expert/topic/3000/3000689.xml?temp=.311413 cheeralen(夏日香气)

/*

DWORD WaitForMultipleObjects(

  DWORD nCount,                 //你有多少个线程

  const HANDLE* lpHandles,      //一个HANDLE数组,用来存放你要等待的所以线程的句柄

  BOOL bWaitAll,                //是否等待所有线程,还是只有其中一个执行完就OK

  DWORD dwMilliseconds          //等待时间

);

 

HANDLE handle1=CreateThread(...);

HANDLE handle2=CreateThread(...);

HANDLE handle3=CreateThread(...);

HANDLE handle4=CreateThread(...);

 

HANDLE lpHandles[4]={handle1,handle2,handle3,handle4};

nCount=4;

bWaitAll=true;

dwMilliseconds=INFINITE;

这样就会等待上面4个线程都执行完了,才会返回

*/

2.    不规定线程数目

在多线程网络编程,比如转发数据的,服务每收到一条消息,就起一个发送线程,而且此时的服务线程也另外起了一个。

线程模式式这样的:

ThreadProc()

{

   if(accept(Socket))

   {

      AfxBeginThread(发送线程)

      AfxBeginThread(ThreadProc)//把自己重新起一遍,这样就每次都能获得线程的返回值,而且对于网络编程,省掉了对数据进行处理的时间

      return 1;

   }

   AfxBeingThread(ThreadProc);

   return -1;

}

不可能枚举出所有发送线程的Handle(如果服务线程是用while方式的还可以)。于是就用用一个记数器nActive,和一个CRITICAL_SECTION(防止线程访问冲突)

子线程进去的时候,

nActive++

退出的时候

nActive--;

主线程要退出的时候

                            int nCnt = 0;//等待次数

                            while(nCnt<10&&nActive>0)

                            {

                                   nCnt++;

                                   ::Sleep(200);

                            }

超出等待次数,就直接退出了

而另外一种, 也是现在在网络上出现最多的写法,是这样:

ThreadProc()

{

       while(!ThreadExit)

       {

            if(accept(Socket))

            {

           AfxBeginThread(发送线程)

            }

       }

   return -1;

}

笔记(4月29日)

一: 栈:先进后出,画图存储元素(A,B,C)(压栈),并取出(弹栈),画图进行演示 队列:先进先出,横向队列,存入取出,画图演示、 数组:查询快,增删慢(自己创建一个数组int[] arr = {1...
  • qq_38186433
  • qq_38186433
  • 2017年05月03日 15:03
  • 104

学习日记 2015年4月29日

学习linux就是无尽的环境配置。各种问题,主要还是没有一个统的流程。把这几天遇到的问题汇总一下1.SublimeText 2 问题1.1在ubuntu15下不能输入中文。 在网上找到的解决办法,写一...
  • ggggttt23
  • ggggttt23
  • 2015年05月03日 20:56
  • 254

有两种实现多线程的方式以及两种方式之间的区别

Java中有两种实现多线程的方式。一是直接继承Thread类,二是实现Runnable接口。那么这两种实现多线程的方式在应用上有什么区别呢?          为了回答这个问题,我们可以通过编写...
  • u013449800
  • u013449800
  • 2014年08月22日 18:40
  • 3929

两种单例模式比较(懒汉式、恶汉式)

懒汉式单例模式在类加载时不实例化该单例对象,在调用公共方法时才实例化,因此类加载速度快,运行时速度较慢。而饿汉式单例模式在类加载时就实例化该单例对象,因此类加载速度慢,运行时速度较快。...
  • kyyee
  • kyyee
  • 2015年12月23日 10:24
  • 1106

多线程实现的两种方式及其区别

继承Threadpublic class Demo2_Thread { public static void main(String[] args) { MyThread mt ...
  • StriverLi
  • StriverLi
  • 2017年02月26日 21:07
  • 1265

FTP 两种模式 总结

com.enterprisedt.net.ftp.FTPClient FTP组件的使用: ftp.getConnectMode() ftp.isAutoPassiveIPSubstitution(...
  • njitluoluo
  • njitluoluo
  • 2013年12月25日 17:19
  • 929

Java 多线程并发解决方案

Java 多线程并发编程会有许多不同的问题,主要有如下问题的应用: 多线程读写共享数据同步问题并发读数据,保持各个线程读取到的数据一致性的问题。 解决方案: sync...
  • langjian2012
  • langjian2012
  • 2015年03月22日 22:08
  • 4893

jsp的两种开发模式

Jsp设计模式 n JSP设计模式包括两个: n (1)Model1,JSP+JavaBean设计模式 n (2)Model2,MVC设计模式 模式一JSP+JavaBean模式 n 在这种...
  • Caster_Saber
  • Caster_Saber
  • 2015年06月19日 11:56
  • 1332

FTP两种工作模式介绍

http://blog.chinaunix.net/uid-372384-id-2413918.html http://my.oschina.net/binny/blog/17469 1.主动FT...
  • qq100440110
  • qq100440110
  • 2016年04月04日 20:54
  • 4539

Java设计模式(二):单例模式的5种实现方式,以及在多线程环境下5种创建单例模式的效率

这段时间从头温习设计模式。记载下来,以便自己复习,也分享给大家。 package com.iter.devbox.singleton; /** * 饿汉式 * @author Shearer...
  • hardwin
  • hardwin
  • 2016年05月23日 12:14
  • 1047
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:两种模式多线程的解决方案[2004年4月29日 10:53]
举报原因:
原因补充:

(最多只允许输入30个字)