Avatar billede 01753 Nybegynder
19. marts 2004 - 10:52 Der er 3 kommentarer

mailbox og semafor

Jeg skal ha kodet en mailbox ud fra nogle semaforer, så jeg kan benytte mailboxen i linux. er der nogen som har noget kode der kan bruges, og eller nogle ideer til hvordan man kan implmentere det?
Avatar billede bertelbrander Novice
20. marts 2004 - 00:26 #1
Det er er ret let at lave mailkøen vha. en std::list, f.ex:

#include <iostream>
#include <list>
#include <string>

struct MailType
{
  int Type;
  std::string msg;
};

typedef std::list<MailType *> MailQueueType;
MailQueueType MailQueue;

void MailPost(int type, const char *msg)
{
  MailType *mail = new MailType;
  mail->Type = type;
  mail->msg = msg;
  MailQueue.push_back(mail);
}

std::string MailGet(int *type)
{
  if(!MailQueue.empty())
  {
    MailType *mail = MailQueue.front();
    MailQueue.pop_front();
    *type = mail->Type;
    std::string S = mail->msg;
    delete mail;
    return S;
  }
  *type = -1;
  return "";
}

int main()
{
  MailPost(10, "Hello");
  MailPost(20, " ");
  MailPost(30, "World");

  while(1)
  {
    int Type;
    std::string S = MailGet(&Type);
    if(Type > 0)
      std::cout << S;
    else
    {
      std::cout << std::endl;
      return 0;
    }
  }
}

Så skal du blot tilføje et par semaphorer, en til at beskytte selve køen og en til at synkronisere mellem de tråde der benytter mailbox'en.
Avatar billede 01753 Nybegynder
22. marts 2004 - 12:39 #2
hvis jeg nu har brug for et dynamisk antal tråde, som skal kommunikere, altid fra tråd 1-2 og 2-3 og 3-4 osv. skal jeg så bare lave et antal mail køer som passer med antal tråde -1, og så beskytte dem med semaforer? Og hvordan nøjagtigt beskytter jeg dem? en wait, og en signal? eller hvad?
Avatar billede bertelbrander Novice
22. marts 2004 - 23:33 #3
Normalt laver man en mailbox per tråd der skal kunne modtage mails, således at der kun er en tråd der henter mails i en kø, men flere der poster i mailboxen. Hver tråd henter kun mails fra en mailbox.

Den tråd der henter mails fra boxen skal sættes til at vente (wait) på en semaphor, som bliver frigivet (signal) når der er nogen der poster til mailboxen. Denne semaphor skal være en counting semaphor dvs den skal kunne tælle det antal mails der skal kunne være i mailbox'en.
I toppen af MailGet skal der således være en wait og i bunden af MailPost skal der være en signal.

Så er der blot et spørgsmål tilbage; hvad sker der når/hvis to tråde forsøger at poste i samme mailkø samtidig eller en tråd kalder MailGet samtidig med at en anden kalder MailPost? Så vil der kunne opstå en konflikt. Så vidt jeg ved er der nogen std::list implementationer der er "threadsafe" og så er der ikke noget problem. Men hvis ikke std::list er threadsafe er i nødt til at pakke access til mailkøen ind i en binær semaphor (også kaldet en mutex). Det kan gøres ved at lave en wait på denne semaphor i starten af MailGet og MailPost og en signal i slutningen af disse.

DVS til hver thread skal der være en mailbox, hver mailbox har en eller to semaphorer.
Avatar billede Ny bruger Nybegynder

Din løsning...

Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.

Loading billede Opret Preview
Kategori
Kurser inden for grundlæggende programmering

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester