Шаг 125 - Статическая память потоков.

www.adept7.kiev.ua
| Форум| Гостевая| Ссылки| Программы| Исходные тексты| Наши партнеры.|
   
| Главная| Рассылки| Услуги| Библиотека| Новости| Авторам| Программистам| Студентам|
delphi c++ assembler
 

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

#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

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

125_1.gif (4673 b)


Загрузить проект | Предыдущий Шаг | Следующий Шаг | Оглавление

Автор Каев Артем.
Используются технологии uCoz
 

Rambler's Top100 Rambler's Top100

©  Adept Design Studio

Используются технологии uCoz