Эта память, которая доступна только одному потоку, она помещается в адресном пространстве потока. Естественно, что в ней будут содержаться переменные, которые доступны только потоку. Это удобно. Нет необходимости синхронизировать доступ к ней и так далее. А ведет себя она точно также как обычная переменная. Смотрим код: #include "stdafx.h" #include "windows.h" #include "iostream.h" #include "process.h"// специально для потока
void fThredFunct1(void* pv);// декларация функции потока void fThredFunct2(void* pv);// декларация функции потока
int i=10;// тестировочная переменная
void main() { ULONG hThread1 = 0;// Идентификатор потока 1 ULONG hThread2 = 0;// Идентификатор потока 2 //unsigned long _beginthread( void( __cdecl *start_address )( void * ), //unsigned stack_size, void *arglist ); hThread1 = _beginthread(fThredFunct1,0,NULL);// создали первый поток if (hThread1==-1) cout << "Error create thread" << endl; hThread2 = _beginthread(fThredFunct2,0,NULL);// создали второй поток if (hThread1==-2) cout << "Error create thread" << endl; Sleep(1000);// ждем потоки cout << "main " << i << endl; }
void fThredFunct1(void* pv)// реализация функции потока { cout << "Thread1 Runnig" << endl; i=i+30; cout << "Thread1 " << i << endl; }
void fThredFunct2(void* pv)// реализация функции потока { cout << "Thread2 Runnig" << endl; i=i+50; cout << "Thread2 " << i << endl; }
Результат его работы будет такой. Thread1 Runnig Thread1 40 Thread2 Runnig Thread2 90 main 90 Press any key to continue
То есть с переменной int могут работать все потоки. Это требует синхронизации как минимум. Давайте объявим ее как локальную статическую для потока. __declspec(thread) int i=10;// тестировочная переменная И опять запустим пример на выполнение. Thread1 Runnig Thread1 40 Thread2 Runnig Thread2 60 main 10 Press any key to continue
Результат будет уже другой. Для каждого потока эта переменная будет своя. Изменения в одном потоке не влияет на нее в другом потоке. |