8
votes

Quelle est la différence entre une lecture bloquante et non bloquante?

Ajouter à la question ci-dessus Le concept d'un indicateur d'attente d'attente / NO comme paramètre à une fonction de lecture de lecture dans un environnement TCP / IP ou UDP.

Une description de la fonction tiers indique que:

Cette fonction est utilisée pour lire un message à partir d'une file d'attente définie par un appel de registre précédent. L'indicateur d'attente d'attente / aucun indicateur d'attente déterminera si cette fonction bloquera la file d'attente spécifiée, en attente des données à placer sur la file d'attente. Si l'option NémAIME est spécifiée et qu'aucune donnée n'est disponible, un pointeur NULL sera renvoyé à l'appelant. Lorsque les données disponibles, cette fonction renvoie un pointeur sur les données lues à partir de la file d'attente.

Qu'est-ce que cela signifie pour une fonction de blocage ou de non-blocage?


0 commentaires

4 Réponses :


4
votes

Jetez un coup d'œil à ceci: http://www.scottklement.com/rpg/ Socktut / NONBLOCKING.HTML

Voici quelques extraits de celui-ci:

  • 'Par défaut, les sockets TCP sont en mode "blocage". Par exemple, lorsque vous appelez RECV () à lire à partir d'un flux, le contrôle n'est pas retourné à votre programme tant que au moins un octet des données est lu à partir du site distant. Ce processus d'attente de données apparaissant est appelé "blocage". '

  • 'Il est possible de définir un descripteur de sorte qu'il soit placé en mode "non bloquant". Lorsqu'il est placé en mode non bloquant, vous n'attendez jamais qu'une opération complète. Il s'agit d'un outil inestimable si vous devez basculer entre de nombreuses prises connectées différentes et que vous voulez vous assurer qu'aucun d'entre eux ne causent le programme de «se verrouiller». '

    En outre, il est généralement judicieux d'essayer de rechercher d'abord une réponse (Tapez simplement "Blocage par rapport à la lecture non bloquante" dans un moteur de recherche), puis une fois que vous avez frappé un mur là-bas et poser des questions qui posent des questions qui Vous ne pouviez pas trouver une réponse à. Le lien que j'ai partagé ci-dessus était le deuxième résultat de la recherche. Jetez un coup d'œil à ce grand essai sur ce qu'il faut faire avant de poser des questions sur des forums Internet: http://www.catb.org/~esr/faqs/smart-Quaistions.html#before


3 commentaires

Je suis à l'intérieur d'un fil que j'ai créé et je veux lire uniquement à partir d'une file d'attente lorsque des données sont disponibles, sinon lorsqu'il n'y a pas de données, je voudrais que le processeur vérifie les autres threads (par exemple, le principal à partir de laquelle j'ai créé ce fil ). Lequel dois-je utiliser? Blocage ou option non bloquante?


Je suis allé sur Internet mais je ne frappais rien de rien directement lié ou utile. Le débordement de pile bénéficie d'une prime de grands esprits. Donc, je demande seulement ici si je ne réussis pas sur mes recherches Google. Merci pour votre réponse.


Pas de soucis. De toute façon, j'espère que la réponse ci-dessus était utile. Jetez un coup d'œil à l'essai que j'ai lié, aussi - c'est une grande lecture.



11
votes

Blocage signifie que l'exécution de votre code (dans ce fil) s'arrête pendant la durée de l'appel. Essentiellement, l'appel de la fonction ne reviendra pas tant que l'opération de blocage est terminée.

Une lecture de blocage attendra jusqu'à ce qu'il y ait des données disponibles (ou un délai d'attente, le cas échéant, expire), puis renvoie à partir de l'appel de la fonction. Une lecture de lecture non bloquante (ou du moins) toujours renvoyer immédiatement, mais cela pourrait ne pas renvoyer aucune donnée, si aucun n'est disponible pour le moment.


3 commentaires

Je suis à l'intérieur d'un fil que j'ai créé et je veux lire uniquement à partir d'une file d'attente lorsque des données sont disponibles, sinon lorsqu'il n'y a pas de données, je voudrais que le processeur vérifie les autres threads (par exemple, le principal à partir de laquelle j'ai créé ce fil )


@ user553514: "Bloc" signifie que ce fil d'exécution bloque. D'autres threads peuvent toujours être programmés pendant que ce fil bloque.


@Stevejessop: Merci d'avoir clarifié qui est bloqué. C'était ma confusion principale.



5
votes

Une analogie si vous me le permettez - désolé, il est tard dans l'après-midi et je suis d'humeur, si cela se fait voter - ah bien ...

Vous voulez entrer dans une discothèque snazzy, mais le videur vous dit que vous ne pouvez pas aller jusqu'à ce que quelqu'un sort. Vous êtes efficacement «bloqué» sur cette condition. Quand quelqu'un sort, vous êtes libre d'entrer dans - ou une condition d'erreur comme "sont ces formateurs?" Votre nuit ne démarre pas vraiment jusqu'à ce que vous entriez, votre plaisir est «bloqué».

Dans un scénario "non bloquant", vous direz le videur de votre numéro de téléphone et il vous rappellera quand il y a une fente gratuite. Alors maintenant, vous pouvez faire autre chose en attendant que quelqu'un sort, vous pouvez commencer votre nuit quelque part ailleurs et revenir quand appelé et continuer là-bas ...

Désolé si cela n'a pas aidé ...


2 commentaires

@Downvoter .. d'accord, qu'est-ce qui ne va pas avec mon analogie? L'OP a demandé ce qui est "Blocking" vs "non bloquant" ...


Pour un scénario de "blocage", le videur ne vous laisserait pas partir s'il s'est avéré que le club était plein; Vous n'aviez aucune alternative mais attendez. Pour un scénario "non bloquant", vous pouvez demander au videur s'il y avait de l'espace et serait libre de partir dans l'espoir de revenir plus tard lorsqu'il y a de l'espace, mais une admission réussie nécessiterait de montrer au moment où un espace existe. . Le scénario "Asynchrone d'E / S" est celui où vous quittez votre numéro avec le videur.



0
votes

Dans votre cas, cela signifie que la fonction ne reviendra pas tant qu'il n'y a pas de message à retourner. Cela empêchera votre programme d'aller de l'avant, mais lorsqu'il est avancé, vous aurez un message avec lequel travailler.

Si vous spécifiez NOWAIT , un pointeur NULL sera renvoyé immédiatement s'il n'y a aucun message sur la file d'attente, ce qui vous permet de traiter cette situation.


0 commentaires