Ταυτοχρονισμός στα Windows NT
Νηματικές διεργασίες
Οι
νηματικές διεργασίες (threads)
είναι ένας τρόπος ταυτοχρονισμού στον οποίο
οι διεργασίες μοιράζονται τα όλα τα δεδομένα εκτός από αυτά που
υπάρχουν στη στοίβα (δηλ. τις τοπικές μεταβλητές).
Η δημιουργία τους υποστηρίζεται συνήθως από το λειτουργικό σύστημα και
το μεταγλωττιστή.
Στα Windows NT μπορούμε να δημιουργήσουμε πολλαπλές νηματικές διεργασίες
με τη συνάρτηση _beginthread
Χρησιμοποιείται ως εξής:
void
thread_function(int *parameter)
{
}
/* Used to pass a parameter to the thread */
int parameter_value;
main()
{
parameter = 42;
_beginthread(thread_function, 0, ¶meter);
}
Ένα νήμα μπορεί να τερματίσει τη λειτουργία του με τη συνάρτηση
_endthread.
Σημαφόροι
Στα Windows 32 (95/98/NT/2000/...) μια σειρά από συναρτήσεις επιτρέπουν
το χειρισμό σημαφόρων.
-
Η συνάρτηση CreateMutex δημιουργεί και επιστρέφει έναν
νέο σημαφόρο.
Χρησιμοποιείται ως εξής:
HANDLE mutex; /* Declare semaphore variable */
mutex = CreateMutex(NULL, FALSE, NULL); /* Create semaphore */
-
Η συνάρτηση WaitForSingleObject είναι η αντίστοιχη της WAIT.
Χρησιμοποιείται ως εξής:
WaitForSingleObject(mutex, INFINITE);
-
Η συνάρτηση ReleaseMutex είναι η αντίστοιχη της SIGNAL.
Χρησιμοποιείται ως εξής:
ReleaseMutex(mutex);
Παράδειγμα αποκλεισμού περιοχής:
HANDLE mutex= CreateMutex(NULL, FALSE, NULL);
WaitForSingleObject(mutex, INFINITE);
/* Critical work starts here */
fseek(fp, desired_position, 0L );
fwrite(data, sizeof( data ), 1, fp );
/* Critical work ends here */
ReleaseMutex(mutex);
Μεταγλώττιση
Δηλώσεις για τις συναρτήσεις που αναφέραμε στις προηγούμενες παραγράφους
υπάρχουν στην επικεφαλίδα <windows.h> και <process.h>.
Για να μεταγλωττίσουμε ένα πρόγραμμα που περιέχει νηματικές διεργασίες
προσθέτουμε στην εντολή του μεταγλωττιστή τις παραμέτρους
/D_MT /MT .
Παράδειγμα:
cl -D_MT /MT test.c