KalosAner Blog

「山穷水复疑无路,柳暗花明又一村。」

Windows 线程同步

一、引言 线程同步类似线程锁,主要用来安全地访问临界资源。Windows 下有两种线程同步的方式,一种是用户模式下的线程同步,一种是内核模式下的线程同步。 二、用户模式 用户模式下的线程同步由于不需要切换内核模式所以性能相对较高,但是功能没有内核模式强大。 用户模式下的线程同步主要使用 CRITICAL_SECTION 对象。 函数原型: 1 2 3 4 5 6 7 #inclu...

Linux 线程使用方法

一、引言 多进程在使用时有很多不方便,比如: 创建进程开销较大 进程间数据交换需要特殊的 IPC 技术 进程切换需要 CPU 频繁的“上下文切换”,造成极大的开销 因此衍生出了线程技术,线程和进程一样都有一个唯一标识符。 在 Linux 上使用线程,在编译链接时需要对线程库进行链接:g++ demo.cpp -o demo -lpthread。 线程是系统调度的最小...

Linux 信号量使用方法

一、引言 在多线程编程中,经常会使用信号量来控制访问临界资源。 二、线程级信号量 初始化信号量 1 2 #include <semaphore.h> int sem_init(sem_t *sem, int pshared, unsigned int value); sem:信号量对象指针 pshared:共享标志(0 表示线程间共享,非 0 表示进程间共享) v...

Linux 上常用的标准 IO 函数

一、引言 write 和 read 是通用的系统调用;recv 和 send 是专为网络通信设计的扩展接口,数据系统调用,但是用户可以对其进行封装;fread 和 fwrite 是标准 IO 库函数。 二、系统调用 系统调用在调用时会通过内核缓冲区对数据进行缓冲。 延迟写入 当程序调用 write 函数时,数据并不会直接写入磁盘,而是暂存内核缓冲区,批量地写入磁盘。这样多次小文件写...

IO 复用之 epoll

一、引言 IO复用之 select 介绍了基于 select 的 IO 复用方法,但是 select 函数每次需要向操作系统传递监视对象信息导致性能太低,并且每次都需要对所有的文件描述符进行遍历查看是否有事件到来。select 适用于服务器端访问量小需求可移植性的程序。 有一种方式只需要向操作系统传递一次监视对象,当监视范围或者内容发送变化时,函数只返回发生变化的部分。在 Linux 上...

多播与广播

一、引言 多播和广播都是向多个主机传递数据的方式,主要区别在于多播可以向多播组中的所有主机传递数据,广播可以向整个子网的所有主机传递数据。 二、多播 多播(Multicast)方式基于 UDP 传输数据。多播通信需要先建立多播组,加入该组的主机即可接收发往该多播组的数据。发送端只需要向多播组发送一次数据。每个多播组都有一个多播组 IP,多播组的 IP 属于 D 类 IP 地质(224....

send 和 recv 函数

一、引言 send 和 recv 函数是网络编程中基础的 I/O 函数,虽然在 Linux 上 write 和 read 函数也可以用来通信,但是 write 和 read 本质上是文件操作函数。send 和 recv 函数在 Linux 和 Windows 上很相似,兼容性更强。 二、Linux 中的 send 和 recv 函数原型: 1 2 3 4 5 #include <...

IO复用之 select

一、引言 I/O 复用是指一个进程维护多个 I/O 套接字。传统的通信可能每个套接字都需要一个进程维护,这样会占用更多的资源(进程需要分配内存),由于在服务过程中等待通信会占用大量的时候导致进程闲置,所以可以使用一个进程维护多个套接字。I/O 复用有多种方法:select、poll、epoll(Linux 专用)、kqueue(macOS/FreeBSD专用)、IOCP(Windows专用...

Writes and Write-Nots

原文: Writes and Write-Nots I’m usually reluctant to make predictions about technology, but I feel fairly confident about this one: in a couple decades there won’t be many people who can write. On...

SQL best practices – don’t compare count(*) with 0

原文: SQL best practices – don’t compare count(*) with 0 Every now and then I see something like this: 1 2 SELECT u.* FROM users u WHERE 0 = (SELECT COUNT(*) FROM addresses a WHERE a.user_id = u....