C++ C++ C# C# ASP.NET Security ASP.NET Security ASM ASM Скачать Скачать Поиск Поиск Хостинг Хостинг  
  Программа для работы с LPT портом...
Язык: .NET — ©Alexey...
  "ASP.NET Atlas" – AJAX в исполнении Micro...
Язык: .NET — ©legigor@mail.ru...
  "Невытесняющая" Многопоточность...
Язык: C/C++ — ©...
  01.05.2010 — Update World C++: Сборник GPL QT исходников
  15.12.2007 — Весь сайт целиком можно загрузить по ссылкам из раздела Скачать
Хостинг:
Windows 2003, ASP.NET 2.0
бесплатный и от 80 руб./мес


   Отправить письмо
Кулабухов Артем, Беларусь




 125 - Статическая память потоков / Win 32 API / Win32 API

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

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

#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)


Загрузить проект | | |
Автор Каев Артем.
[AD]