Πρόσφατα συμμετείχα porting μια τριανταδυάμπιτη εφαρμογή που γράφτηκε αρχικά για τη Microsoft WINDOWS NT σε GNU/Linux. Αυτή η εφαρμογή περιείχε έναν μεγάλο αριθμό κλήσεων σε NtWaitForSingleObject και έναν μικρότερο αριθμό κλήσεων σε NtWaitForMultipleObject.
Τώρα οποιος δήποτε που έχουν πρέπει κώδικας λιμένων που περιέχει περισσότερο από μερικές περιπτώσεις αυτών των των ιδιαίτερων Win32 APIs, ή οι στενοί ξάδελφοί τους WaitForSingleObjectEx, MsgWaitForMultipleObjects, MsgWaitForMultipleObjectsEx, κ.λπ. στη Unix ή GNU/Linux πιθανώς ήδη ανατριχιάζει με την ανάμνηση των μακριών σκληρών ημερών και των νυχτών της κωδικοποίησης δοκιμής και λάθους που δοκιμάζει και που μιμείται σωστά τη σημασιολογία και τη λειτουργία αυτού του του ιδιαίτερου Microsoft Windows συγκεκριμένο APIs, αλλά για τον αναγνώστη που δεν έπρεπε ακόμα να προσπαθήσει στο λιμένα μια τέτοια εφαρμογή, αυτή η θέση και η επόμενη θέση μου μπορούν να σας βοηθήσουν εκτός από τη λογικότητά σας (και ενδεχομένως την τρίχα σας!) κάποτε στο μέλλον.
Επ'ευκαιρία και το δύο APIs είναι χαρακτηρισμένο αποδοκιμασμένος σε MSDN από τη Microsoft αλλά ακόμα την εργασία όπως αναμένεται στα WINDOWS NT και τα Windows XP. Δεν είμαι βέβαιος για Vista ή τα παράθυρα 7 παραθύρων δεδομένου ότι δεν τους έχω εξετάσει σε αυτά τα λειτουργικά συστήματα. Το δύο αποδοκιμασμένο APIs έχει αντικατασταθεί από το ισοδύναμο APIs WaitForSingleObject και WaitForMultipleObject αντίστοιχα. Για το υπόλοιπο αυτής της θέσης θα συζητήσω ακριβώς την αντικατάσταση APIs αλλά οι περισσότεροι από αυτού που λέω θα ισχύσουν για είτε αποδοκιμασμένη είτε την αντικατάσταση API.
Στην πρώτη εξέταση WaitForSingleObject φαίνεται αρκετά καλοκάγαθο. Η περιγραφή σε MSDN δηλώνει ότι «αυτή η λειτουργία επιστρέφει όταν είναι το διευκρινισμένο αντικείμενο στο επισημαμένο κράτος ή όταν παρέρχεται το διάστημα διαλείμματος». Ήχοι όπως ένα αρκετά απλό και αβλαβές API, δικαίωμα; Ίσως κάτι παρόμοιο με το POSIX.1 API pthread_cond_timedwait. Καλά, κάνετε λάθος απολύτως και αυτή η θέση και ο ακόλουθος θα εξηγήσουν γιατί.
Το WaitForSingleObject και οι ξάδελφοί του μπορούν να περιμένουν ένα σήμα από οποιαδήποτε ή όλα τα ακόλουθα «αντικείμενα»: ανακοίνωση αλλαγής, εισαγωγή κονσολών, γεγονός, εργασία, ανακοίνωση των πόρων μνήμης, mutex, διαδικασία, σηματοφόρος, νήμα και waitable χρονόμετρο και στις περιορισμένες περιστάσεις στα αρχεία και το αρχείο I/O. Όταν επισημαίνεται κατάλληλα, ένα νήμα είναι απελευθερωμένο και συνεχίζεται. Κανένα δημοσιευμένο τυποποιημένο API στο GNU/Linux ή τον κόσμο της Unix δεν έρχεται ερχόμενος στο χειρισμό αυτής της σειράς των αντικειμένων σε ένα ενιαίο API.
Αυτό είναι πιθανώς η μια ενιαία περιοχή όπου ένα Win32 API σχεδιάζεται καλύτερα από το GNU/Linux ή το σύνολο της Unix API. Σε GNU/Linux και τη Unix υπάρχει συγκεκριμένο APIs για να περιμένει τα διαφορετικά είδη