Статическая память потоков

Эта память, которая доступна только одному потоку, она помещается в адресном пространстве потока. Естественно, что в ней будут содержаться переменные, которые доступны только потоку. Это удобно. Нет необходимости синхронизировать доступ к ней и так далее. А ведет себя она точно также как обычная переменная. Смотрим код:

#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

Результат будет уже другой. Для каждого потока эта переменная будет своя. Изменения в одном потоке не влияет на нее в другом потоке.

 
« Предыдущая статья   Следующая статья »