¿Cuál es la diferencia entre bloqueo y no bloqueo?

Contestaré esta pregunta suponiendo que quisieras decir una llamada bloqueada o no bloqueada. Las llamadas pueden ser IO o de otra manera.

La respuesta es bastante evidente por sus nombres.
Suponga que lo siguiente es mi rastro de instrucciones:
UNA
si
foo ()
do
re

Entonces, hay dos instrucciones A y B que se ejecutan, seguidas de una llamada a ‘foo’ y luego, cuando regresa foo, se ejecutan C y D.

Suponga que una llamada a foo abre un cuadro emergente (GUI simple con botones)

Caso I: foo está bloqueando –
La llamada a foo abrirá el cuadro emergente, y foo no volverá de inmediato, no hasta que se cierre el cuadro emergente. Por lo tanto, la ejecución de C y D tendrá que esperar hasta que el usuario haya terminado con la GUI. Una vez que el usuario elimina el cuadro, se ejecutan C y D.

CASO II : foo no es bloqueo.
En este caso, foo abrirá un cuadro emergente y el programa continuará la ejecución de C y D. Básicamente, lo que sucede es que hay un subproceso en segundo plano creado para manejar la GUI para que el subproceso principal no tenga que esperar. De esta manera, la llamada no se bloquea.

En otro escenario, suponga que foo debe leer algunos datos del búfer.

Caso I: foo está bloqueando –
En caso de que haya datos válidos para leer en el búfer, regresa de inmediato. De lo contrario, si el búfer está vacío, espera hasta que haya algunos datos en el búfer para que se lean. De esta manera bloquea el hilo principal.

CASO II : foo no es bloqueo –
Si no hay datos válidos en el búfer, esta función simplemente regresará. posiblemente estableciendo algún bit de error o devolviendo un -1. Cualquiera que sea la situación del búfer, no hace que el hilo principal espere.

Estos son solo dos ejemplos muy simples de llamadas bloqueantes / no bloqueantes, puede leer más en línea.