C# 语言的多线程编程,完全是本科OS里的知识
基本知识,无参数Thread和带参数的Thread
Thread类的参数就是参数指针,可以传入一个无参的函数。
如果要传入带参数的函数,先new一个ParameterizedThreadStart委托实例,带参数的函数名作为它的参数。带参数的函数必须且只能有一个object参数。参考下面的
ConterWithParam(object param)
static int iCnt = ;
static readonly int N = ; static void Main(string[] args)
{
Thread[] thrs = new Thread[N];
for (int i = ; i < N; i++)
{
thrs[i] = new Thread(Counter);
thrs[i].Start();
}
for (int i = ; i < N; i++)
{
thrs[i].Join();
}
Console.WriteLine(iCnt); iCnt = ; ParameterizedThreadStart[] thrsp = new ParameterizedThreadStart[N];
object param = ;
for (int i = ; i < N; i++)
{
thrsp[i] = new ParameterizedThreadStart(ConterWithParam);
thrs[i] = new Thread(thrsp[i]);
thrs[i].Start(param);
}
for (int i = ; i < N; i++)
{
//当NewThread调用Join方法的时候,MainThread就被停止执行,直到NewThread线程执行完毕
thrs[i].Join();
}
Console.WriteLine(iCnt);
} static void Counter()
{
Thread.Sleep();
iCnt++;
//Console.WriteLine("finish iCnt++,now iCnt is " + iCnt);
} static void ConterWithParam(object param)
{
Thread.Sleep();
int i = (int)param;
iCnt += i;
//Console.WriteLine("finish iCnt+"+i+",now iCnt is " + iCnt);
}
该例子输出结果

2)互斥信号灯mutex
第一节的结果是不是有点奇怪。明明加了10000次,结果却是9550.
带参数的那个例子,一次加2,加10000次,应该是20000才对。结果却是19678.
这是因为对全局变量的访问iCnt出现了冲突。比如两个线程同时取到了iCnt=0时的值,同时执行了i++,那么iCnt的最后状态肯定是1,而不是会2。为了让iCnt得到正确的值。
我们引入互斥信号灯。
static int iCnt = ;
static readonly int N = ;
static Mutex mut = new Mutex(); static void Main(string[] args)
{
Thread[] thrs = new Thread[N];
for (int i = ; i < N; i++)
{
thrs[i] = new Thread(Counter);
thrs[i].Start();
}
for (int i = ; i < N; i++)
{
thrs[i].Join();
}
Console.WriteLine(iCnt); iCnt = ; ParameterizedThreadStart[] thrsp = new ParameterizedThreadStart[N];
object param = ;
for (int i = ; i < N; i++)
{
thrsp[i] = new ParameterizedThreadStart(ConterWithParam);
thrs[i] = new Thread(thrsp[i]);
thrs[i].Start(param);
}
for (int i = ; i < N; i++)
{
//当NewThread调用Join方法的时候,MainThread就被停止执行,直到NewThread线程执行完毕
thrs[i].Join();
}
Console.WriteLine(iCnt);
} static void Counter()
{
Thread.Sleep();
//锁
mut.WaitOne();
iCnt++;
//释放
mut.ReleaseMutex();
//Console.WriteLine("finish iCnt++,now iCnt is " + iCnt);
} static void ConterWithParam(object param)
{
Thread.Sleep();
//锁住
mut.WaitOne();
int i = (int)param;
iCnt += i;
//释放
mut.ReleaseMutex();
//Console.WriteLine("finish iCnt+"+i+",now iCnt is " + iCnt);
}
本次执行结果

3) 同步信号灯Semaphore
用最经典的生产者-消费者来解释。
static Semaphore sem = new Semaphore(, );
static Semaphore sem2 = new Semaphore(, ); static void Main(string[] args)
{
Console.WriteLine("消费者等生产者生产一个item");
Thread thConsumer = new Thread(Consume);
thConsumer.Start();
Thread thProductor = new Thread(Product);
thProductor.Start(); thConsumer.Join();
thProductor.Join();
Console.WriteLine("............................."); Console.WriteLine("多并发的例子.....");
for (int i = ; i < ; i++)
{
Thread t1 = new Thread(Consume2);
t1.Start();
Thread t2 = new Thread(Product2);
t2.Start();
}//end for } static void Product()
{
Thread.Sleep();
Console.WriteLine("Product an item...");
sem.Release();
} static void Consume()
{
Thread.Sleep();
Console.WriteLine("Consumer is waiting an item...");
sem.WaitOne();
Console.WriteLine("Consumer get an item...");
} static void Product2()
{
Thread.Sleep();
Console.WriteLine("Product an item...");
sem2.Release();
} static void Consume2()
{
Thread.Sleep();
Console.WriteLine("Consumer is waiting an item...");
sem2.WaitOne();
Console.WriteLine("Consumer get an item...");
}

C# 语言的多线程编程,完全是本科OS里的知识的更多相关文章
- Rust语言的多线程编程
我写这篇短文的时候,正值Rust1.0发布不久,严格来说这是一门兼具C语言的执行效率和Java的开发效率的强大语言,它的所有权机制竟然让你无法写出线程不安全的代码,它是一门可以用来写操作系统的系统级语 ...
- C语言 之 多线程编程
一.基础知识 计算机的核心是CPU,承担了所有的计算任务. 操作系统是计算机的管理者,负责任务的调度.资源的分配和管理,统领整个计算机硬件. 应用程序则是具有某种功能的程序,程序是运行于操作系统之上的 ...
- linux下c语言的多线程编程
我们在写linux的服务的时候,经常会用到linux的多线程技术以提高程序性能 多线程的一些小知识: 一个应用程序可以启动若干个线程. 线程(Lightweight Process,LWP),是程序执 ...
- java多线程编程(1) 线程的基本知识
在前面研究过多线程与进程的区别. 这里在稍微总结一下: 进程:程序动态的一次执行过程. 线程:可以只是程序员的一部分的执行过程 每个进程有多个线程组成,在java程序中,至少两个线程一个是垃圾回收线程 ...
- linux下C语言多线程编程实例
用一个实例.来学习linux下C语言多线程编程实例. 代码目的:通过创建两个线程来实现对一个数的递加.代码: //包含的头文件 #include <pthread.h> #include ...
- C语言中的多线程编程
很久很久以前,我对C语言的了解并不是很多,我最早听说多线程编程是用Java,其实C语言也有多线程编程,而且更为简单.方便.强大.下面就让我们简单领略一下Unix C语言环境下的多线程编程吧! 下面先看 ...
- C语言多线程编程
HANDLE CreateThread(LPSECURITY_ATTRIBUTES lpThreadAttributes, DWORD dwStackSize, LPTHREAD_START_ROUT ...
- C语言使用pthread多线程编程(windows系统)二
我们进行多线程编程,可以有多种选择,可以使用WindowsAPI,如果你在使用GTK,也可以使用GTK实现了的线程库,如果你想让你的程序有更多的移植性你最好是选择POSIX中的Pthread函数库,我 ...
- Linux C语言多线程编程实例解析
Linux系统下的多线程遵循POSIX线程接口,称为 pthread.编写Linux下的多线程程序,需要使用头文件pthread.h,连接时需要使用库libpthread.a.顺便说一下,Linux ...
随机推荐
- 学习笔记 broswerify + watchify + beefy
broswerify “Browserify lets you require('modules') in the browser by bundling up all of your depende ...
- deepinmind(转)
http://it.deepinmind.com/ 花名有孚,支付宝工程师 有希望加入支付宝的同学,可以把简历发到我的个人邮箱spidercoco@gmail.com
- CentOS 7 / RHEL 7 上安装 LAMP + phpMyAdmin
原文 CentOS 7 / RHEL 7 上安装 LAMP + phpMyAdmin 发表于 2014-11-02 作者 Haoxian Zeng 更新于 2014-12-12 之前根据在 Lin ...
- centos编译内核:no space left on device 解
1.问题:在下面的根文件夹中的原始源代码 编译出现 no space left on device 利用df -h 命令查看 根文件夹空间占用完成 2.将源代码改在其它空间非常足的地方编译 在make ...
- [Error]EOL while scanning string literal
有一个经常性的工作项目.需要一天的一些表数据到外部接口,但最近总是异常.今天检查的原因. 第一本地和测试环境中测试程序是没有问题,有网络环境只会在日志中抛出一个异常.产生主要的例外是推定异常数据. , ...
- 联合县城市,采用ajax,而使用ul模拟select下拉
接待处代码 js //采用jquery展示鼠标放到省ul下拉显示 $("#province").hover(function(){ ...
- ASP.NET MVC 使用TryUpdateModel 更新的技巧
有使用 ASP.NET MVC 的朋友應該會對於 TryUpdateModel 有一定的認知,他不但可以利用 Metadata 來做欄位的驗證確保資料的正確性,也可以指定更新的條件以及不更新的條件來達 ...
- mac_开启ftp并访问
[启动&关闭] mac下一般用smb服务来进行远程文件访问,但要用FTP的话,高版本的mac os默认关掉了,可以用如下命令打开: sudo -s launchctl load -w /Sys ...
- JSON多层数据添加与访问
最近项目中有要用到,JSON的多层数据对象,相当是一个json格式数组里面嵌套一个json对象吧,至于我为什么要用到这个呢,引入业务场景: 两组数据 1: user_id user_h ...
- SDUT 1124-飞跃荒野(三维BFS)
飞跃原野 Time Limit: 5000ms Memory limit: 65536K 有疑问?点这里^_^ 题目描写叙述 勇敢的法里奥出色的完毕了任务之后.正在迅速地向自己的基地撤退.但因为 ...