Главная страница


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)
 
 

Вернуться к списку тем, сортированных по: возрастание даты  уменьшение даты  тема  автор 

 Тема:    Автор:    Дата:  
 параллельные процессы.   Evgeni Golotvin   19 Oct 2001 00:27:46 
 Re: параллельные процессы.   Viktor Karev   19 Oct 2001 21:17:00 
 Re^2: параллельные процессы.   Andrey Dashkovsky   20 Oct 2001 11:36:04 
 Re: параллельные процессы.   Viktor Karev   22 Oct 2001 21:21:03 
Архивное /ru.algorithms/657769e0c367.html, оценка 1 из 5, голосов 10
Яндекс.Метрика
Valid HTML 4.01 Transitional