现在位置: 首页 > 多线程编程
在linux多线程环境下对同一变量进行读写时,经常会遇到读写的原子性问题,即会出现竞争条件。为了解决多个线程对同一变量访问时的竞争条件问题,操作系统层面提供了锁、信号量、条件变量等几种线程同步机制。如果对变量的每次访问都使用上述机制,由于系统调用会陷入内核空间,需要频繁的进行上下文切换,这就导致了程序的时间开销比较大。 自然的,我们就想到,在多线程环境中,在某些情况下是否能减少甚至避免使用系统调用?...
阅读全文
2017-03-21 13:59 工业·编程 ⁄ 共 2693字 评论 1 条
    协程是在线程之上由“用户”构建的并发单元,对OS来说无感知,协程的切换由用户自己管理和调度。(这里的用户是相较于内核而言的,一些通用库这里也理解为用户) C/C++怎么实现协程     作为一个C++后台开发,我知道像go, lua之类的语言在语言层面上提供了协程的api,但是我比较关心C++下要怎么实现这一点,下面的讨论都是从C/C++程序员的角度来看协程的问题的。 boost和腾讯都推出了相关的库...
阅读全文
读写锁是把共享资源的访问分为读者和写者。读者能共享访问,写者能进行写操作.很明显这个比简单的互斥访问要好很多。提高性能效率我的理解是在设计上遵循以下原则 1.锁的深度 范围 2.多线程对共享资源访问的频率 次数 3.让访问尽量可控。 读写锁我觉得就是让这种访问可控. 一、读写锁的特征   1.当读写锁是写加锁状态时, 在这个锁被解锁之前, 所有试图对这个锁加锁的线程都会被阻塞.   2.当读写锁在读加锁状态时, ...
阅读全文
2016-07-18 22:53 工业·编程 ⁄ 共 917字 暂无评论
互斥锁:mutex,用于保证在任何时刻,都只能有一个线程访问该对象。当获取锁操作失败时,线程会进入睡眠,等待锁释放时被唤醒 自旋锁:spinlock,在任何时刻同样只能有一个线程访问对象。但是当获取锁操作失败时,不会进入睡眠,而是会在原地自旋,直到锁被释放。这样节省了线程从睡眠状态到被唤醒期间的消耗,在加锁时间短暂的环境下会极大的提高效率。但如果加锁时间过长,则会非常浪费CPU资源 读写锁:rwlock,区分读和写,...
阅读全文
文章目录 一、死锁的定义 三、如何避免死锁 一、死锁的定义 多线程以及多进程改善了系统资源的利用率并提高了系统 的处理能力。然而,并发执行也带来了新的问题——死锁。所谓死锁是指多个线程因竞争资源而造成的一种僵局(互相等待),若无外力作用,这些进程都将无法向前推进。 下面我们通过一些实例来说明死锁现象。 先看生活中的一个实例,2个人一起吃饭但是只有一...
阅读全文
2015-11-09 16:55 工业·编程 ⁄ 共 10498字 暂无评论
    上篇文章《多线程断点续传研究(1) 》写完,由于整体思路是正确的,但是没有真正形成多线程下载,所以对本身的代码进行关键点的检查,尤其在一些操作web请求的地方,看看是否有什么问题,最后发现显示的关闭HttpWebResponse对象,能稍微有所改进。 那么修改后的类,大致代码如下: //--------------------------- Download File class --------------------------------------- //--------------------------...
阅读全文
2015-11-08 14:10 工业·编程 ⁄ 共 13419字 评论 1 条
知道通过HttpWebRequest就可以进行多线程断点下载,是我不用考虑从Socket写起。 对于一个多线程断点续传程序,我大致认为只要考虑如下几点问题就行了。 1. 下载数据可以从给定位置进行; 2. 可以进行分块下载; 3. 记录下载位置,以供下次重新下载的时候使用。 通过对原文的阅读来看,发现以上问题的前两个已经实现。这样会使需要附加的操作会更简单些。 为了能记录每个线程下载的位置,我借用了最简单的方式,就是xml方式。...
阅读全文
2015-11-07 05:07 工业·编程 ⁄ 共 7744字 暂无评论
有时候 会遇到这样的需求:实现多线程的断点续传。今天就我平时的一些实战的经验 来给大家写一个多线程断点续传的例子,希望对大家有所帮助。 一、多线程下载的原理 多线程下载: 多线程下载的基本原理就是由一个完整的文件分成几个不同部分,然后分别由不同的线程去下载这几个部分,把它下载到本地之后,我们将其进行合并,合并完成之后就能得到完整的文件 断点续传: 第一次下载时我们下载这么多,假如遇到了网络状态不太好或...
阅读全文
2015-09-22 11:53 工业·编程 ⁄ 共 327字 暂无评论
    windows中每个运行的程序都是一个进程,每一个进程都会创建一个或多个线程,这些线程称之为软件线程。一个进程至少有一个线程,称为主线程。     硬件线程,也称之为逻辑内核或逻辑处理器,windows将每一个硬件线程识别为一个可调度的逻辑处理器,每一个逻辑处理器可以运行软件线程的代码,windows调度器可以决定将一个软件线程赋给一个硬件线程,通过这种方式均衡每一个硬件线程的工作负载...
阅读全文
2015-08-28 21:09 工业·编程 ⁄ 共 1419字 暂无评论
  做游戏的同学想必对云风很熟悉。这一段时间他开发的skynet和ejoy2d两个软件框架在github上很火。其中skynet是为游戏服务器开发的,可以看成是一个service框架,ejoy2d是一个客户端的代码,内容不多,主要封装了opengl的一些接口,很多人不一定看得上。     我对游戏服务器不熟,但是服务器的相关代码还是看了一些的。之前vsftpd、redis、sshd、mysqld的代码也看过不少,多少知道一点。这次趁周末将skynet...
阅读全文