
网络编程与多线程
文章平均质量分 70
爱橙子的OK绷
时刻准备着。。。
展开
-
当析构函数遇到多线程 ── C++中线程安全的对象回调
编写线程安全的类不是难事,用同步原语保护内部状态即可。但是对象的生与死不能由对象自身拥有的互斥器来保护。如何保证即将析构对象 x 的时候,不会有另一个线程正在调用 x 的成员函数?或者说,如何保证在执行 x 的成员函数期间,对象 x 不会在另一个线程被析构?如何避免这种竞态条件是 C++ 多线程编程面临的基本问题,可以借助 boost的shared_ptr 和 weak_ptr 完美解决。这也是实现转载 2016-05-26 15:13:40 · 3719 阅读 · 0 评论 -
多线程如何实现同步
在多个线程并发执行访问同一个数据时,如果不采取相应的措施,将会是非常危险的。所谓同步(synchronization)就是指一个线程访问数据时,其它线程不得对同一个数据进行访问,即同一时刻只能有一个线程访问该数据,当这一线程访问结束时其它线程才能对这它进行访问。同步最常见的方式就是使用锁(Lock),也称为线程锁。锁是一种非强制机制,每一个线程在访问数据或资源之前,首先试图获取(Acquire)锁,转载 2016-05-26 17:37:04 · 2564 阅读 · 0 评论 -
Unix网络编程-同步
1、互斥锁(量)和条件变量默认情况下互斥锁和条件变量用于线程间同步,若将它们放在共享内存区,也能用于进程间同步。1.1 互斥锁1、概述: 互斥锁(Mutex,也称互斥量),防止多个线程对一个公共资源做读写操作的机制,以保证共享数据的完整性。用以保护临界区,以保证任何时候只有一个线程(或进程)在访问共享资源(如代码段)。保护临界区的代码形式:lock_the_mutex(...);临界区unlo原创 2016-05-29 11:20:05 · 9366 阅读 · 0 评论 -
I/O复用和I/O模型
由《Unix网络编程卷1》总结而来。1、I/O复用同时监视多个I/O条件,在其中任意一个就绪时通知进程,这样的能力称为I/O复用。由select和poll函数支持,较新的还有Posix中的pselect函数。(Linux中还有epoll)。I/O复用应用场合:1)客户同时处理多个描述符时,必须使用I/O复用。2)客户同时处理多个套接字时(比较少见)。3)一个TCP服务器既要处理监听套接字,又要处原创 2016-05-27 18:39:00 · 586 阅读 · 0 评论 -
select、poll、epoll总结及ET、LT区别
select,poll,epoll都是IO多路复用的机制。I/O多路复用就通过一种机制,可以监视多个描述符,一旦某个描述符就绪(一般是读就绪或者写就绪),能够通知程序进行相应的读写操作。但select,poll,epoll本质上都是同步I/O,因为他们都需要在读写事件就绪后自己负责进行读写,也就是说这个读写过程是阻塞的,而异步I/O则无需自己负责进行读写,异步I/O的实现会负责把数据从内核拷贝到用户转载 2016-04-06 10:40:33 · 4108 阅读 · 1 评论 -
Socket编程中用send发送结构体
最近在开发一个Linux下的聊天软件,好久没有做C语言的开发了,感觉到很多东西已经生疏了,这下又碰到用Socket传递结构体的问题,google了一下,发现也有不少朋友遇到同样的问题,所以就打算写出自己的解决办法,跟大家分享。Socket中的send函数可以发送字符串,但不能直接发送结构体,因此在发送端先把结构体转成字符串,然后用send发送,在接收端recv字符串,再转换成原先的结构体,这个就是解转载 2016-03-07 14:41:02 · 7550 阅读 · 1 评论 -
Linux网络编程和套接字
1、套接字概述套接字的本意是插座,在网络中用来描述计算机中不同程序与其他计算机程序的通信方式。 常用的套接字类型有3种: 1)流套接字(SOCK——STREAM):使用了面向连接的可靠的数据通信方式,即TCP套接字; 2)数据报套接字(Raw Sockets):使用了不面向连接的数据传输方式,即UDP套接字; 3)原始套接字(SOCK——RAW):没有经过处理的IP数据包,可以根据自己程序的原创 2016-05-26 22:25:52 · 10117 阅读 · 0 评论 -
进程间通信方式
进程间的通信(IPC)如何实现? 1、管道( pipe )既可在程序中使用,也可在shell中使用。管道是一种半双工的通信方式,数据只能单向流动。管道的问题在于他们没有名字,只能在具有亲缘关系(父子进程间)的进程间使用。扩展: 管道由pipe函数创建,提供一个单向数据流。当需要一个双向数据流时,我们必须创建两个管道,每个方向一个。这也就是全双工管道的实现原理:由两个半双工管道构成。2、命名管道 (原创 2015-11-05 20:09:07 · 2181 阅读 · 0 评论 -
域名和网络地址结构体---struct hostent
该结构体定义如下:struct hostent{ char *h_name; //主机名,即官方域名 char **h_aliases; //主机所有别名构成的字符串数组,同一IP可绑定多个域名 int h_addrtype; //主机IP地址的类型,例如IPV4(AF_INET)还是IPV6 int h_length; //主机IP地址长度,IPV4地址为4原创 2016-11-30 21:20:40 · 9118 阅读 · 1 评论 -
C++11 多线程
C++11开始支持多线程编程,之前多线程编程都需要系统的支持,在不同的系统下创建线程需要不同的API如pthread_create(),Createthread(),beginthread()等,使用起来都比较复杂,C++11提供了新头文件<thread>、<mutex>、<atomic>、<future>等用于支持多线程。使用C++11开启一个线程是比较简单的,下面来看一个简单的例子:#inclu转载 2016-05-26 16:32:26 · 427 阅读 · 0 评论 -
秒杀多线程第十三篇---读者写者问题继:读写锁SRWLock
在《秒杀多线程第十一篇读者写者问题》文章中我们使用事件和一个记录读者个数的变量来解决读者写者问题。问题虽然得到了解决,但代码有点复杂。本篇将介绍一种新方法——读写锁SRWLock来解决这一问题。读写锁在对资源进行保护的同时,还能区分想要读取资源值的线程(读取者线程)和想要更新资源的线程(写入者线程)。对于读取者线程,读写锁会允许他们并发的执行。当有写入者线程在占有资源时,读写锁会让其它写入者线程和读转载 2015-12-03 13:54:28 · 951 阅读 · 0 评论 -
秒杀多线程第一篇---多线程笔试面试题汇总
转自:http://blog.youkuaiyun.com/morewindows/article/details/7392749一.概念性问答题第一题:线程的基本概念、线程的基本状态及状态之间的关系?第二题:线程与进程的区别? 这个题目问到的概率相当大,计算机专业考研中也常常考到。要想全部答出比较难。 第三题:多线程有几种实现方法,都是什么?第四题:多线程同步和互斥有几种实现方法,都是什么? 我在参转载 2015-11-09 22:49:48 · 490 阅读 · 0 评论 -
秒杀多线程第二篇---CreateThread与_beginthreadex本质区别
本文将带领你与多线程作第一次亲密接触,并深入分析CreateThread与_beginthreadex的本质区别,相信阅读本文后你能轻松的使用多线程并能流畅准确的回答CreateThread与_beginthreadex到底有什么区别,在实际的编程中到底应该使用CreateThread还是_beginthreadex?使用多线程其实是非常容易的,下面这个程序的主线程会创建了一个子线程并等待其运行完毕转载 2015-11-10 12:03:46 · 676 阅读 · 0 评论 -
秒杀多线程第三篇---原子操作 Interlocked系列函数
上一篇《多线程第一次亲密接触 CreateThread与_beginthreadex本质区别》中讲到一个多线程报数功能。为了描述方便和代码简洁起见,我们可以只输出最后的报数结果来观察程序是否运行出错。这也非常类似于统计一个网站每天有多少用户登录,每个用户登录用一个线程模拟,线程运行时会将一个表示计数的变量递增。程序在最后输出计数的值表示有今天多少个用户登录,如果这个值不等于我们启动的线程个数,那显然转载 2015-11-10 16:02:16 · 1085 阅读 · 0 评论 -
秒杀多线程第四篇---一个经典的多线程同步问题
上一篇《秒杀多线程第三篇原子操作 Interlocked系列函数》中介绍了原子操作在多进程中的作用,现在来个复杂点的。这个问题涉及到线程的同步和互斥,是一道非常有代表性的多线程同步问题,如果能将这个问题搞清楚,那么对多线程同步也就打下了良好的基础。程序描述:主线程启动10个子线程并将表示子线程序号的变量地址作为参数传递给子线程。子线程接收参数 -> sleep(50) -> 全局变量++ -> s转载 2015-11-12 16:29:55 · 946 阅读 · 0 评论 -
秒杀多线程第五篇---经典线程同步 关键段(临界区)CS
上一篇《秒杀多线程第四篇 一个经典的多线程同步问题》提出了一个经典的多线程同步互斥问题,本篇将用关键段CRITICAL_SECTION来尝试解决这个问题。本文首先介绍下如何使用关键段,然后再深层次的分析下关键段的实现机制与原理。关键段CRITICAL_SECTION一共就四个函数,使用很是方便。下面是这四个函数的原型和使用说明。1、函数功能:初始化函数原型:void InitializeCritic转载 2015-11-12 21:24:58 · 1011 阅读 · 1 评论 -
秒杀多线程第六篇---经典线程同步 事件Event
阅读本篇之前推荐阅读以下姊妹篇:《秒杀多线程第四篇 一个经典的多线程同步问题》 《秒杀多线程第五篇 经典线程同步关键段CS》上一篇中使用关键段来解决经典的多线程同步互斥问题,由于关键段的“线程所有权”特性所以关键段只能用于线程的互斥而不能用于同步。本篇介绍用事件Event来尝试解决这个线程同步问题。首先介绍下如何使用事件。事件Event实际上是个内核对象,它的使用非常方便。下面列出一些常用的函数。转载 2015-11-12 21:57:23 · 484 阅读 · 0 评论 -
秒杀多线程第七篇---经典线程同步 互斥量Mutex
阅读本篇之前推荐阅读以下姊妹篇:《秒杀多线程第四篇一个经典的多线程同步问题》 《秒杀多线程第五篇经典线程同步关键段CS》 《秒杀多线程第六篇经典线程同步事件Event》前面介绍了关键段CS、事件Event在经典线程同步问题中的使用。本篇介绍用互斥量Mutex来解决这个问题。互斥量也是一个内核对象,它用来确保一个线程独占一个资源的访问。互斥量与关键段的行为非常相似,并且互斥量可以用于不同进程中的线转载 2015-11-26 17:46:07 · 425 阅读 · 0 评论 -
秒杀多线程第八篇---经典线程同步 信号量Semaphore
阅读本篇之前推荐阅读以下姊妹篇: 《秒杀多线程第四篇一个经典的多线程同步问题》 《秒杀多线程第五篇经典线程同步关键段CS》 《秒杀多线程第六篇经典线程同步事件Event》 《秒杀多线程第七篇经典线程同步互斥量Mutex》前面介绍了关键段CS、事件Event、互斥量Mutex在经典线程同步问题中的使用。本篇介绍用信号量Semaphore来解决这个问题。首先也来看看如何使用信号量,信号量Sema转载 2015-11-27 14:32:59 · 647 阅读 · 0 评论 -
秒杀多线程第九篇---经典线程同步总结 关键段 事件 互斥量 信号量
前面《秒杀多线程第四篇一个经典的多线程同步问题》提出了一个经典的多线程同步互斥问题,这个问题包括了主线程与子线程的同步,子线程间的互斥,是一道非常经典的多线程同步互斥问题范例,后面分别用了四篇 《秒杀多线程第五篇经典线程同步关键段CS》 《秒杀多线程第六篇经典线程同步事件Event》 《秒杀多线程第七篇经典线程同步互斥量Mutex》 《秒杀多线程第八篇经典线程同步信号量Semaphore》来转载 2015-11-27 15:09:12 · 663 阅读 · 0 评论 -
秒杀多线程第十篇---生产者消费者问题
继经典线程同步问题之后,我们来看看生产者消费者问题及读者写者问题。生产者消费者问题是一个著名的线程同步问题,该问题描述如下:有一个生产者在生产产品,这些产品将提供给若干个消费者去消费,为了使生产者和消费者能并发执行,在两者之间设置一个具有多个缓冲区的缓冲池,生产者将它生产的产品放入一个缓冲区中,消费者可以从缓冲区中取走产品进行消费,显然生产者和消费者之间必须保持同步,即不允许消费者到一个空的缓冲区中转载 2015-11-30 10:04:06 · 549 阅读 · 0 评论 -
秒杀多线程第十一篇---读者写者问题
与上一篇《秒杀多线程第十篇 生产者消费者问题》的生产者消费者问题一样,读者写者也是一个非常著名的同步问题。读者写者问题描述非常简单,有一个写者很多读者,多个读者可以同时读文件,但写者在写文件时不允许有读者在读文件,同样有读者在读文件时写者也不去能写文件。上面是读者写者问题示意图,类似于生产者消费者问题的分析过程,首先来找找哪些是属于“等待”情况。第一.写者要等到没有读者时才能去写文件。第二.所有读者转载 2015-12-01 15:01:21 · 542 阅读 · 0 评论 -
秒杀多线程第十二篇---多线程同步内功心法:PV操作
阅读本篇之前推荐阅读以下姊妹篇:《秒杀多线程第四篇一个经典的多线程同步问题》 《秒杀多线程第五篇经典线程同步关键段CS》 《秒杀多线程第六篇经典线程同步事件Event》 《秒杀多线程第七篇经典线程同步互斥量Mutex》 《秒杀多线程第八篇经典线程同步信号量Semaphore》 《秒杀多线程第九篇经典线程同步总结关键段事件互斥量信号量》 《秒杀多线程第十篇生产者消费者问题》 《秒杀多线程转载 2015-12-03 11:09:48 · 631 阅读 · 0 评论 -
sockaddr和sockaddr_in详解
struct sockaddr和struct sockaddr_in这两个结构体用来处理网络通信的地址。一、sockaddrsockaddr在头文件#include <sys/socket.h>中定义,sockaddr的缺陷是:sa_data把目标地址和端口信息混在一起了,如下:struct sockaddr { sa_family_t sin_family;//地址族 cha转载 2016-11-24 21:58:18 · 172325 阅读 · 5 评论