2009-07-07 4 views
2

Supposons qu'il existe deux types de paquets dans le serveur de discussion. Ces deux paquets sont utilisés pour obtenir le statut d'un autre utilisateur. Un (appelez cela comme REQ-STAT, RES-STAT) est formulaire de demande et de réponse et un autre (NOT-STAT) est paquet de formulaire de notification.Problème de synchronisation général dans la programmation réseau

Par exemple, si j'envoie [REQ-STAT simpson] au serveur et je peux obtenir [RES-STAT simpson en ligne]. Ou, si le statut de l'utilisateur SIMPSON a été changé, je vais obtenir le statut de l'utilisateur comme [NOT-STAT simpson offline]. OK, le serveur fonctionne sur une machine multi-core et utilise plusieurs threads, bien sûr.

Si le serveur se [REQ-STAT simpson] paquet, le serveur préparera paquet [RES-STAT simpson en ligne] - si le SIMPSON est en ligne. À ce stade, le SIMPSON s'est déconnecté, de sorte que le serveur envoie le paquet [NOT-STAT simpson offline] au client. Une fois le serveur envoyé paquet [NOT-STAT simpson hors ligne], paquet [RES-STAT simpson en ligne] est envoyé

// the server lock during using user data structure but not for the whole process. 

------[REQ-STAT simpson]------> simpson is online and prepare response packet 

<--[NOT-STAT simpson offline]-- simpson has been logged out and send not packet 

<--[RES-STAT simpson online]--- send response 

// the latest packet does not have the latest information !!! 

ci-dessus peut scénario se produire si BLOCAGE n'a pas utilisé pour processus? Si oui, dois-je verrouiller tout cela? D'autres solutions?

Merci.

Répondre

1

Eh bien, il semble que vous pouvez le résoudre par la façon dont le programme de réception traite les différents paquets.

Si le programme demande si SIMPSON est en ligne, il attend une réponse par oui ou par non. Mais il devrait traiter cela comme: SIMPSON était ou n'était pas en ligne environ le temps que j'ai envoyé ma demande, mais il aurait pu se déconnecter 1 milliseconde après que ce paquet a été créé, donc je ne suis pas garanti qu'il est en ligne maintenant, je sais juste il était quand j'ai demandé. Utilisez cette information pour ce qu'elle vaut. Toutefois, lorsque le programme reçoit un paquet "SIMPSON signé", alors vous savez que SIMPSON s'est déconnecté à l'heure indiquée dans le paquet. Si vous recevez ce message, vous annulez toute demande de statut actuel en attente, car on vous a simplement dit qu'il l'avait validée. Donc "annuler" la demande d'état en cours s'il y en a une. Par abandon, j'entends gracieusement arrêter ce fil ou ignorer le résultat de cette requête. Une autre option consiste à incorporer dans chaque paquet un horodatage à haute résolution (qui doit être sûr pour les threads) ou un compteur séquentiel thread-safe, spécifique au client, afin que le client puisse déterminer l'ordre des événements indépendamment du ordre de les recevoir. Les pratiques standard de programmation thread-safe vous permettront de faire cela et il semble que vous connaissiez cela.

Questions connexes