黄巾之乱-服务器线程控制

424人阅读 评论(0) 收藏 举报
分类:


我有一个场景:

有N个线程,它们一起执行,等到N个线程执行完成后,有一个A线程执行。

A线程执行完成后,N个线程又一起冲出来,同时执行。  这样周而复始。

(N线程的个数未知,它们的个数可能随时都在变化)


我想要这种结果:

N1线程
N2线程
N3线程
A 线程
------------------
N3线程
N1线程
N2线程
N4线程
A 线程
--------------------
N1线程
N2线程
A 线程
--------------------



之前使用了MS的读写锁来实现,但总觉得不够清晰,自己用代码来实现了:


using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;
using System.Collections;
using System.Threading;
using System.Collections.Concurrent;
using System.Diagnostics;

namespace threadcontrol
{ 
    public partial class Form1 : Form
    {

        static ConcurrentDictionary<int, bool> dict_done = new ConcurrentDictionary<int, bool>();

        

        public Form1()
        {
            InitializeComponent();
            Control.CheckForIllegalCrossThreadCalls = false;         

                    
            Thread aThread = new Thread(new ThreadStart(princess));            
            aThread.Start();
            
        }


        private void button1_Click(object sender, EventArgs e)
        {          
            Thread nThread = new Thread(new ThreadStart(dwarf));
            nThread.Start();
        }



        private void dwarf()
        {

            int hashid = Thread.CurrentThread.ManagedThreadId;

            dict_done.TryAdd(hashid, false);

            while (true)
            {

                if (dict_done[hashid]) { Thread.Sleep(100); }
                else {                    
                        //do something
                        listBox1.Items.Insert(0, "dwarf");

                        dict_done[hashid] = true;
                      }
            }
        }



        private void princess()
        {
            while (true)
            {
                if (!all_done()) { Thread.Sleep(100); } //有人没完成
                else { //全部完成
                    
                    Thread.Sleep(1000);
                    listBox1.Items.Insert(0, "--------------princess  " + dict_done.Count.ToString());

                    set_kong();//全部读线程初始
                    }
            }
        }





        public bool all_done()
        {
           bool tmp = true;

           foreach (var key in dict_done.Keys)
                {
                    if (dict_done[key] == false) { tmp = false; break; }
                }
            return tmp;
        }


        public void set_kong()        
        {         
            foreach (var key in dict_done.Keys)
            {
                dict_done[key] = false;
            }
          
        }  



    }
}





查看评论

PHP7会话控制

-
  • 1970年01月01日 08:00

新游戏发布《三国记黄巾之乱》—新引擎预热

一,关于引擎: 《三国记黄巾之乱》是用鄙人新开发的flash脚本引擎LegendForFlashProgramming0.1制作而成,该引擎完全脱离光荣原版引擎,关于新引擎的下载和使用方法, 请看...
  • lufy_Legend
  • lufy_Legend
  • 2011-10-21 14:49:44
  • 16179

控制一个高消耗CPU的线程数控制方案

由于该后台服务逻辑处理较多,还有一些复杂的计算(牛顿迭代法),后台每次跑一个线程对CPU的消耗比较高,而生产环境是4个CPU8核心(记不太清),每个核上有2个实例部署,每次通过前台调用一个CPU占用率...
  • xxzlhhh
  • xxzlhhh
  • 2016-11-13 22:35:23
  • 356

linux 网络编程之服务器多线程限制

本文讨论服务器端多线程并发的操作和限制: 基于实验结果和百度结果: 实验基础:服务器和客户端,服务器为每个客户端连接开辟线程,验证服务器多线程的最大支持数目 实验环境:ubuntu 12.04 实验结...
  • frank_jb
  • frank_jb
  • 2016-07-26 20:20:25
  • 2112

线程的生命周期以及控制线程

一、线程的生命周期 线程状态转换图: 1、新建状态 用new关键字和Thread类或其子类建立一个线程对象后,该线程对象就处于新生状态。处于新生状态的线程有自己的内存空间,通过调用sta...
  • miss_dongangel
  • miss_dongangel
  • 2016-04-20 00:02:18
  • 3509

设置正确的线程数量

《高性能服务器架构 》中提到了SEDA,我搜了一下,发现这篇文章《SEDA性能优化的分析和模拟 》,对于线程数量的建议。假如一个Web请求,代码执行的时间为ST(Service Time),读文件...
  • benpaobagzb
  • benpaobagzb
  • 2016-06-17 17:56:15
  • 1807

好东西第三方okstor 服务器线程

  • 2009年10月20日 09:05
  • 60KB
  • 下载

第四章 线程

第四章 线程一、定义:线程,有时被称为轻量级进程(Lightweight Process,LWP),是程序执行流的最小单元。一个标准的线程由线程ID,当前指令指针(PC),寄存器集合和堆栈组成。另外,...
  • yangquanhui1991
  • yangquanhui1991
  • 2015-07-29 18:21:07
  • 283

自己的web服务器项目-实现多线程处理(三)

自己的web服务器项目-静态请求和动态请求处理(二) 上面项目中,服务器只能接受单方的请求,不能够多用户同时访问,这明显不符合现实逻辑,那么在这里,我们将其修改为多线程的,实现多用户的访问 首先,...
  • suwu150
  • suwu150
  • 2016-09-10 13:54:46
  • 2615

如何控制玩转多线程

1、 join线程 join():让一个线程等待另一个线程完成的方法。 Join(long millis):在millis内被join的线程没有执行结束,则不再等待。 2、 后台线程 任务...
  • sinat_27933301
  • sinat_27933301
  • 2017-04-17 11:11:01
  • 3827
    个人资料
    持之以恒
    等级:
    访问量: 18万+
    积分: 1719
    排名: 2万+
    skill
    1999 Computer hardware、TurboC2.0
    2000 电信局端接入设备
    2001 CISCO Routers
    2002 SAP46C、BASIS
    2003 VC6++ MFC
    2004 JX外挂
    2005 ASP
    2006 JSP、AJAX、JS、MSSQL2000 (黄巾之乱第一版)
    2007 HP-UX ORACLE Reorganization
    2008 JXSJ外挂,hook API
    2009 AS3、hibernate、MSSQL2005 (黄巾之乱第二版)
    2010 AIX DB2 ECC6 BASIS
    2011 www.haoshangpin.net 淘宝客WEB
    2012 选号程序
    2013 VMware平台、京东销售联盟
    2014 ECC6EHP7 BASIS
    2015 C#、ABAP
    2016 WMS项目、EF6、FineUI、SAP BI42
    2017 UNITY2D、PDA、HP-SOCKET
    最新评论