Thread是一根琴弦

同事说 omni_thread为什么要搞得那么复杂呢?对了,先问一下,你有没有用过这个类?其实,这就是一个对系统线程对象Thread的抽象,以使应用程序可以在不同平台上方便移植,而不论底层具体的线程模型。

起初,这个世界是没有Thread这个概念的,只有Process。我们知道,当初操作系统就是用Process来抽象计算任务的,并负责对Process进行调度。对于单CPU系统,一个时间里只有一个Process能占有CPU而得以执行。后来,不知道从什么时候开始,人们发明了Thread这个概念,Thread就是表示CPU的调度。两者的区别就是,Process是一个实体,包括了具体的代码,而Thread表示的是CPU的调度。

我们知道,代码即使装载进了内存里,而没有被CPU执行也是没有任何意义的。而CPU怎样才能执行代码呢?是的,你必须把下一句执行指令的代码指向你的代码。那么是谁让它去呢?是操作系统。那操作系统怎么让它去呢?这里有必要先说明一下,现在的操作系统都是多任务的系统。所谓的多任务就是说,同时可以运行多个Process。它如何做到有条不紊的来回切换呢?打个比喻,CPU执行代码就像沿着一条线(Thread)移动,虽然这条线有可能弯弯曲曲绕来绕去的,但终究还是一条线.那么,运行多个Process,就要有很多条线。这就像弹中国古筝一样,只是这里你就是操作系统。什么时候发什么音,要看你当时把手指放在什么弦上了。声音是因弦动而起的,而音色则由弦所处位置决定。

所以,Thread就是操作系统放在你的代码里的那个弦,代码因弦而动。操作系统的任务调度归根到底就是对Thread的调度。

好了,扯远了,再回到开头的问题。omni_thread的存在是不是就是因为不同操作系统对琴弦的操作不同啊?嗯,这就像古筝和吉他的区别,而且你能认为钢琴的琴键不是另一种弦吗?所以让程序员写跨平台的程序,就像让音乐家同时熟悉多种乐器一样困难。omni_thread就是要让所有Thread的操作在不同的操作系统上都一样。如果乐器也能有这样一个统一接口,一个人熟练掌握多种乐器就根本不是问题了。要不怎么说,开发软件是高科技呢,哈哈。

另外,Thread的操作实在是一件复杂的事情,不仅在不同平台上,就是在同一个平台上也是如此的。如何在不同的Thread之间保持同步是很复杂的--想想看,女孩子织毛衣,如何穿针是很讲究的。而CPU每秒钟运行百万行的指令,可不容你慢慢想。一不小心就会缠线,或扎到手啦。

说了那么多,根本还没有到我想要说的,很晚了,赶紧打住。我们前面说了,代码本身是死的,只有被CPU执行了才会活起来。而要被CPU执行,就要让Thread穿过。好了,现在我们都说面向对象编程,把世界都用Class来抽象,用Object来表示实体。但是说到底,Object也是代码,根本就是死的。就像木偶一样,如果没有一根Thread拴着就会耷拉下去!对于大部分的Object来说,大部分时间里它都是死的,只有Thread穿过的瞬间才会灵光一闪。那么怎样让一个Object永葆青春,光芒四射呢?答案就是,用一个Thread永远拴着它。这样它就可以在那里不停跳动,它活了!

omni_thread就是这样一个带Thread的木偶,一旦栓动就活起来了。当然,这只是一个傀儡,你需要在上面依附你的实体,也就是你的代码。现在,你看上去就像一个天使了,会煽动翅膀的天使!

其实,很多类库里都有这样的Thread封装类。比如Java里的Runnable,.NET里的Thread,MFC里的CWinThread,都是同一个东西。我个人最喜欢的就是Java里的叫法,Runnable多形象啊!

当然,我也看到很多C++的程序员根本就不用上面的什么omni_thread,而直接用pthread_create(),CreateThread()自己去引线拴木偶。虽然麻烦点,但是人家乐意嘛。

最后推荐一篇文章《 白话面向智能体编程》,就是讲的如何让OOP变得更自然,那就是AOP。这里的Object变成了Agent,也就是由一个死的东西,变成了一个活物。这不由让我想起了中国古代哲学家王阳明,他好像说过这样的话,“花儿之所以存在是因为我在看它”。很唯心是不是?但是现在的OOP就是这样的,如果你不去运行它,它就真的不会动啊!Agent就不一样了,你爱看不看,我都在那里爱怎么动怎么动。文章里关于“烧鸡块”的比喻实在是精辟!虽然现在禽流感流行,不过只看看也无妨吧。

实现一个线程库通常涉及到操作系统级别的编程,因为线程的创建、管理和调度等工作是由操作系统内核直接控制的。在高级编程语言中,如C或C++,可以通过调用操作系统提供的API来创建和管理线程。下面是一个简单的线程库的基本框架概念: 1. **线程创建**:提供一个函数用于创建新的线程,这个函数通常需要接收一个线程入口函数指针和该函数的参数。 2. **线程执行**:线程库需要有一个调度器来管理线程的执行,它会根据线程的状态来调度线程的执行顺序。 3. **线程同步**:提供同步机制,如互斥锁、条件变量等,以避免线程间的竞争条件和保证线程间的正确交互。 4. **线程终止**:提供一个机制来安全地终止线程,确保线程在退出前能正确地释放资源。 5. **线程属性设置**:允许用户设置线程的属性,如优先级、栈大小等。 6. **线程局部存储**:允许线程拥有自己的私有数据存储空间,这在多线程程序中非常有用。 下面是一个使用C语言的伪代码示例,展示了如何实现一个简单的线程库的基本结构: ```c #include <stdio.h> #include <pthread.h> // 线程函数原型 void* thread_function(void* arg); // 线程库提供的创建线程的接口 void create_thread(void (*func)(void*), void* arg) { pthread_t thread; // 调用POSIX线程库创建线程 if (pthread_create(&thread, NULL, func, arg) != 0) { fprintf(stderr, "Error creating thread\n"); return; } } // 线程函数示例 void* thread_function(void* arg) { // 执行线程相关操作 printf("Thread is running\n"); // 线程退出 pthread_exit(NULL); } int main() { // 使用线程库创建一个线程 create_thread(thread_function, NULL); // 等待线程结束 pthread_join(thread_function, NULL); return 0; } ``` 在这个例子中,`create_thread`函数使用了POSIX线程库(pthread)的函数`pthread_create`来创建一个新线程,新线程会执行`thread_function`函数。`main`函数中演示了如何使用`create_thread`函数创建线程,以及如何等待该线程结束。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值