知识大搜罗读书@IT·互联网

操作系统简明-2.2:线程 干货整理

2017-05-06  本文已影响128人  Dongle聊测试

👑事件驱动

首先要明确一个概念:

操作系统是事件驱动

他们等待事件发生,对事件做出适当的反应,然后等待下一个事件
举个栗子

对比一下,是不是非事件驱动比较浪费妈妈的时间,因此事件驱动好处也是大大地

当创建一系列事件时候,线程便成为了操作系统中非常关键的结构机制

👑线程概念

线程是线程状态上下文中的执行流。

线程与进程最大不同是:线程可以分享部分状态,特别要提到内存,他们可以读写相同区域的内存(进程不允许),每个线程也会有自己的寄存器,栈

线程必须非常紧密地协调他们的活动,所以可一读写相同内存

👑线程异步

当线程运行时,异步出现的超级频繁,如果程序员不做处理,异步会和其他线程活动发生冲突

一个异步的例子:
两个线程发出磁盘请求。第一个线程开始编写磁盘控制器(假设它是内存映射的,并且必须发出多个写入来指定磁盘操作)。同时,第二个线程运行在不同的处理器上,并将内存映射写入磁盘控制器。磁盘控制器变得非常混乱,读取错误的磁盘块。

而解决办法也很简单:
同步操作---我们后面会着重地将

👑线程接口

class Thread {
public:
Thread(char* debugName);
~Thread();
void Fork(void (*func)(int), int arg);
void Yield();
void Finish();
}

理论上,线程要同时执行。但实际上,操作系统的处理器有限,它不能一次运行所有线程。 因此,必须要复用线程

线程例子

int a = 0;
void sum(int p) {
   a++;
   printf("%d : a = %d\n", p, a);
}
void main() {
   Thread *t = new Thread("child");
   t->Fork(sum, 1); 
   sum(0);
}

解释下
这个程序有两个线程,一是线程t,另一个是线程main,他们同步执行sum函数,注意下:a是全局变量
那么问题来了


这个程序是什么结果
不知道猜对没?
结果有许多种,

这样的操作您还敢肆无忌惮的用吗?下篇文章我们将着重讲些解决方法:同步操作

上一篇 下一篇

猜你喜欢

热点阅读