[原创]线程

btw:这是我工作中的一个总结,感觉写的挺好,贴出来让大家有机会学习一下。哈哈。当然,程序采用化名,而且不会泄露公司机密。:P

线程

一、What Is a Thread?

      虽然不清楚线程底层实现的真正原理,但是那个也许不是特别重要。重要的是,线程与进程有什么区别?

       当我们用fork创建一个新的进程时,实际上我们创建的是一个新的应用程序。他有自己的变量以及PID。这个进程是独立运行的,与创建他的进程几乎毫无关系。

       与之不同的是,当我们创建一个线程时,他虽然有自己的stack,但是却共享全局变量(global variables)、文件描述符(file descriptors)、信号句柄(signal handlers)以及与父进程共享当前的目录状态信息。

       如果不管实现原理的话,对于我们来说,搞清楚线程与进程的区别,有助于我们更好的使用他们。由线程的特点我们可以看到,线程的优势就在于,他既利用了系统的并发特性,又在并发的线程间极大的共享了一些信息。而这个特点,就决定了线程有它所更适合应用的场合。

二、Advantages and Drawbacks of Threads

线程的优点:

1、创建线程的代价远远小于进程。操作系统在线程间切换的成本,以及每个线程所需要消耗的资源,都小于进程。所以,在同样的需求情况下,采用线程可能会更有效率。

2、有时候我们需要一个应用程序,既能够在同一时刻执行两种不同的操作,有需要在其间共享大量的数据资源。在这种情况下,就需要线程。现代数据库为了提高吞吐量,都是采用了多线程机制。但是由于数据库内部数据交互量大,采用线程也是必然趋势。

3、充分利用系统资源。有些应用的操作可能频繁被打断,频繁需要输入或者输出。我们就可以利用线程的特点,在内部共享数据,既可以及时相应输入输出请求,又可以利用空闲的时间进行计算操作。

线程的缺点:

1、编写多线程程序本身就非常复杂,危险。当你涉及同步、异步、竞争、互斥,多单元操作一块共享资源时,就特别要注意,因为即使你很小心,你还是会犯错误。

2、多线程的程序很难调适,因为它们之间的交互是很难控制,并且变化莫测的。

 

三、_REENTRANT

书中说应用多线程编程,应该定义_REENTRANT,可是这个东西从哪里定义呢?后来知道怎么定义了,原来是在编译命令里,不过在现在的系统里,定义不定义好像一个样子老了?我?书?

四、多线程/进程通讯

       不管是同步、互斥、异步,还是其它的什么操作,关键是大家要共享一块资源。同时对这个资源进行操作,于是就有了通讯。细想我们目前所用过的不管是线程还是进程,就是分三个部分。

首先可以通过程序实现。比如在多线程编程中,我们可以通过共享的变量来进行通讯。其次,我们可以利用操作系统所提供的一些方法,比如多线程的mutexSemaphores,多进程中的IPCsignal等。这些由操作系统提供的方法,由操作系统实现了很多功能,帮我们屏蔽了很多细节。不过,用这些东西或许会让我们丧失可移植性?最后,当然我们还可以应用很多很变态的方法,比如文件、网络。这些应用虽然有他们的缺点,但是也有他们的优势。比如文件就比较适合大数据量的场合。而网络呢,则适合分布式程序。试想一下,如果把整个英特网看成一个大的整体,那么每个节点实际上都是一个单独运行的进程,那么网络不就是进程间的通讯吗?

不过在共享操作的同时,有一点是比较麻烦的。就是尽管在我们看来仅仅是一行代码。但实际上运行起来,可能是很多连续得操作。这样就带来一个互斥问题,如果多个实体同时竞争一个资源,自然会打破这些原子操作,于是带来危险。我们需要有些方法能够保证这些原子操作的连续,这些可能对应用程序本身很难,但是操作系统可以帮助我们完成。其实在更高层的应用领域中,也有类似概念。企业开发领域的事务处理概念也很类似。当一个事务中的一个操作被打断后,事务处理的回滚操作会保证该操作的原子性,如此一来,一项事务要么执行,要们就不执行,从而避免了很多问题。

    还有一个问题就是轮训和阻塞。尽管在通讯时,我们可以采用很多方法,但并不是说这些方法的效率都一样。由于一些计算机硬体的特色,所以有时候如果充分利用系统提供的功能,就会得出效率比较高的程序。比如,如果我们在编写程序时,充分利用操作系统的阻塞功能,我们的应用程序就会提高很多的性能,因为我们不需要不停的用一些宝贵的时间片来进行无谓的判断。可是有时候我们就不需进行一些必要的判断,关键还是看我们的需求。

五、Mutex的属性

当采用Mutex进行线程互斥时,默认初始化的Mutex的属性是fast。这种情况下,当该线程请求一个已经被Lock的锁时,本身会被阻塞。而另一个掌握lock的线程如果也同时被阻塞的话,就会陷入死锁状态。可以通过设置Mutex的属性来改变这种状况,但是需要查看pthread_mutex_initmanual page

六、小强的代码

小强本次的代码令我颇为失望J ,它所给我带来的惊喜远远小于上两次。不过小强还是在自己程序的字里行间反映出一些本质的特性。比如他对标志量的处理就与我或者大多数人的想法有些出入。联想上次我和大强的业务逻辑一样,但是我们写出的代码却风格迥异。如果说,那是因为大强与我经验差距甚远的话,那么我和小强的思维为何又差距如此大呢?是本身性格的不同?还是我UI的代码写得太多了?^_^

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值