当前位置: 首页 -  必威体育 - 正文

多线程服务器编程模型:如何正确使用mutex 和condition variable

2019-12-13 22:01 必威体育 南筏94°c
A+ A-

return top;

对于 signal/broadcast 端:

在编程上,TCP sockets 和 pipe 都是一个文件描述符,用来收发字节流,都可以 read/write/fcntl/select/poll 等。不同的是,TCP 是双向的,pipe 是单向的 (Linux),进程间双向通讯还得开两个文件描述符,不方便;而且进程要有父子关系才能用 pipe,这些都限制了 pipe 的使用。在收发字节流这一通讯模型下,没有比 sockets/TCP 更自然的 IPC 了。当然,pipe 也有一个经典应用场景,那就是写 Reactor/Selector 时用来异步唤醒 select (或等价的 poll/epoll) 调用(Sun JVM 在 Linux 就是这么做的)。

pthread_once_t Singleton《T》::ponce_ = PTHREAD_ONCE_INIT;

private:

// 。。.

处理 IO 事件

{

l event loop 用作 non-blocking IO 和定时器。

对于 non-trivial 的服务端程序,一般会采用 non-blocking IO + IO multiplexing,每个 connection/acceptor 都会注册到某个 Reactor 上,程序里有多个 Reactor,每个线程至多有一个 Reactor。

写成代码是:

如果一个 class 要包含 MutexLock 和 Condition,请注意它们的声明顺序和初始化顺序,mutex_ 应先于 condition_ 构造,并作为后者的构造参数:

本文对多线程服务器的常用编程模型进行了一个详细的解读,本文中的多线程服务器是运行在 Linux 操作系统上网络应用程序。介绍了典型的单线程服务器编程模型和典型的多线程服务器的线程模型以及进程间通信与线程间通信等相关内容。

4. 不自己编写 lock-free 代码,不去凭空猜测“哪种做法性能会更好”,比如 spin lock vs. mutex。

}

这有可能出现两个问题(感谢水木网友 ilovecpp 提出):a) 误用了加锁版本,死锁了。b) 误用了不加锁版本,数据损坏了。

l POE (Perl)

std::deque《int》 queue;