# 2.2 解决阻塞死等待的办法

## 2.2.1 阻塞死等待的缺点

![](https://933560069-files.gitbook.io/~/files/v0/b/gitbook-legacy-files/o/assets%2F-Lce3jcJHmjGq8-Jh2Le%2F-Lce3nJKdTRiZ8w-h6L1%2F-Lce3rWq9HiVxEej8lGt%2Flibevent-2-%E8%A7%A3%E5%86%B3%E9%98%BB%E5%A1%9E01.png?generation=1555484089503191\&alt=media)

## 2.2.2 办法一：非阻塞、忙轮询

![](https://933560069-files.gitbook.io/~/files/v0/b/gitbook-legacy-files/o/assets%2F-Lce3jcJHmjGq8-Jh2Le%2F-Lce3nJKdTRiZ8w-h6L1%2F-Lce3rWsAZBf6hslLPJS%2Flibevent-2-%E8%A7%A3%E5%86%B3%E9%98%BB%E5%A1%9E02.png?generation=1555484086995569\&alt=media)

```cpp
while true {
    for i in 流[] {
        if i has 数据 {
            读 或者 其他处理
        }
    }
}
```

## 2.2.3 办法二：select

![](https://933560069-files.gitbook.io/~/files/v0/b/gitbook-legacy-files/o/assets%2F-Lce3jcJHmjGq8-Jh2Le%2F-Lce3nJKdTRiZ8w-h6L1%2F-Lce3rWustv4CJgOYojx%2Flibevent-2-%E8%A7%A3%E5%86%B3%E9%98%BB%E5%A1%9E03.png?generation=1555484089463545\&alt=media)

select 代收员 比较懒，她只会告诉你快递到了，但是是谁到的，你需要挨个快递员问一遍。

```cpp
while true {
    select(流[]);  //阻塞

    for i in 流[] {
        if i has 数据 {
            读 或者 其他处理
        }
    }
}
```

## 2.2.3 办法三：epoll

![](https://933560069-files.gitbook.io/~/files/v0/b/gitbook-legacy-files/o/assets%2F-Lce3jcJHmjGq8-Jh2Le%2F-Lce3nJKdTRiZ8w-h6L1%2F-Lce3rWwyPH8OAJt7-ae%2Flibevent-2-%E8%A7%A3%E5%86%B3%E9%98%BB%E5%A1%9E04.png?generation=1555484085312485\&alt=media)

```cpp
while true {
    可处理的流[] = epoll_wait(epoll_fd);  //阻塞

    for i in 可处理的流[] {
        读 或者 其他处理
   }
}
```
