|
|
ru.algorithms- RU.ALGORITHMS ---------------------------------------------------------------- From : Viktor Karev 2:5020/400 22 Oct 2001 21:21:03 To : Viktor Karev Subject : Re: параллельные процессы. -------------------------------------------------------------------------------- > Приветствия, Evgeni Golotvin! > Я организовывал семафоры на основе ассемблерной команды проверки и установки > бита. > Поскольку эта операция происходит за одну комманду, то другие процессы > прервать ее не смогут. Склероз... Потом я же переделал на более простую команду, xchg, чтобы работало и на более старых машинах. Hу вот и исходник... Semafor.h --------------------- #ifndef SEMAFOR_H #define SEMAFOR_H #if _MSC_VER > 1000 #pragma once #endif // _MSC_VER > 1000 // Объект для локальной (внутри одной программы) синхронизации class Semafor{ protected: int flag; public: Semafor(); virtual ~Semafor(); // Ждать, пока семафор не освободиться, после чего захватить его void Lock(); // Освободить семафор void Unlock(); }; #endif ---------------------------- Semafor.cpp -------------------------- // Semafor.cpp: implementation of the Semafor class. // ////////////////////////////////////////////////////////////////////// #include "stdafx.h" #include "Semafor.h" ////////////////////////////////////////////////////////////////////// // Construction/Destruction ////////////////////////////////////////////////////////////////////// Semafor::Semafor(){ flag = 0; } Semafor::~Semafor(){ } void Semafor::Lock(){ // Идея в том, что если перед попыткой захвата флаг был занят (установлен в 1), // то он так и останется занят. А если был свободен (0), то установится в 1. int *ia = &flag; _asm{ l1: mov esi,ia mov eax,1 xchg [esi],eax cmp eax,0 jz l2 } Sleep(0); _asm{ jmp l1 l2: } } void Semafor::Unlock(){ int *ia = &flag; __asm{ mov esi,ia mov eax,0 xchg [esi],eax } } -------------------- Вот и все. Виктор. --- ifmail v.2.15dev5 * Origin: Black Jack House (2:5020/400) Вернуться к списку тем, сортированных по: возрастание даты уменьшение даты тема автор
Архивное /ru.algorithms/657769e0c367.html, оценка из 5, голосов 10
|