Twoje PC  
Zarejestruj się na Twoje PC
TwojePC.pl | PC | Komputery, nowe technologie, recenzje, testy
B O A R D
   » Board
 » Zadaj pytanie
 » Archiwum
 » Szukaj
 » Stylizacja

 
M E N U
  0
 » Nowości
0
 » Archiwum
0
 » Recenzje / Testy
0
 » Board
0
 » Rejestracja
0
0
 
Szukaj @ TwojePC
 

w Newsach i na Boardzie
 
OBECNI NA TPC
 
 » resmedia 07:02
 » NimnuL 06:58
 » PeKa 06:38
 » cVas 06:33
 » NWN 05:07

 Dzisiaj przeczytano
 41117 postów,
 wczoraj 25974

 Szybkie ładowanie
 jest:
włączone.

 
ccc
TwojePC.pl © 2001 - 2024
A R C H I W A L N A   W I A D O M O Ś Ć
    

[C++][Threads] Semafory raz jeszcze... :/ , Barts_706 20/06/08 11:32
No więc spróbowałem zrobić programik testowy do użycia semaforów, ale tworzonych ciut inaczej:

#include <unistd.h>
#include <sys/types.h>
#include <sys/sem.h>
#include <stdio.h>
#include <iostream>
#include <iomanip>
#include <string>
#include <sstream>
#include <semaphore.h>
#include <fcntl.h>

std::string timePrint()
{
pid_t pid = getpid();

std::ostringstream os;
time_t now = time(NULL);
struct tm localTime;
memset (&localTime, 0, sizeof(struct tm));
localtime_r(&now, &localTime);
os << std::setw(4) << std::setfill('0') << localTime.tm_year
<< "-" << std::setw(2) << std::setfill('0') << localTime.tm_mon
<< "-" << std::setw(2) << std::setfill('0') << localTime.tm_mday
<< " " << std::setw(2) << std::setfill('0') << localTime.tm_hour
<< ":" << std::setw(2) << std::setfill('0') << localTime.tm_min
<< ":" << std::setw(2) << std::setfill('0') << localTime.tm_sec
<< " [" << pid << "]: ";

std::string ret(os.str());
return ret;
}

int main_semopen(int argc, char **argv);

int main(int argc, char **argv)
{
char semName[] = "/dssv2-updatethread-semaphore";

sem_t *semId = sem_open(semName, O_CREAT, 0666, 0);

if (semId == SEM_FAILED)
{
std::cout << timePrint() << "Unable to create a semaphore... :(" << std::endl;
perror("Semaphore creation problem");
exit(0);
}

std::cout << timePrint() << "Processing started" << std::endl;
srand(time(NULL));
double maxRandomTime = 5.0;

for (unsigned int passCounter = 0; passCounter < 10; ++passCounter)
{
int randomPossessTime = 3 + static_cast<int>(maxRandomTime * rand() / (RAND_MAX + 1.0));
std::cout << timePrint() << "Pass: " << passCounter << std::endl;
std::cout << timePrint() << "Trying to get semaphore..." << std::endl;
std::cout << timePrint() << "Trying to sync on semaphore..." << std::endl;
sem_wait(semId);

std::cout << timePrint() << "Semaphore set up, waiting '" << randomPossessTime << "' seconds..." << std::endl;
sleep(randomPossessTime);
std::cout << timePrint() << "sleep finished, reverting the semaphore state" << std::endl;

std::cout << timePrint() << "Trying to revert the semaphore..." << std::endl;
sem_post(semId);

std::cout << timePrint() << "Semaphore reverted, sleeping two seconds.." << std::endl;
sleep(2);
}
std::cout << timePrint() << "Processing ended" << std::endl;
return 0;
}


No i nadal nie bangla:

[hybd05]:threading> tail -f result.txt
Test started
0108-05-20 04:22:07 [26824]: Processing started
0108-05-20 04:22:07 [26824]: Pass: 0
0108-05-20 04:22:07 [26824]: Trying to get semaphore...
0108-05-20 04:22:07 [26824]: Trying to sync on semaphore...
0108-05-20 04:22:07 [26825]: Processing started
0108-05-20 04:22:07 [26825]: Pass: 0
0108-05-20 04:22:07 [26825]: Trying to get semaphore...
0108-05-20 04:22:07 [26825]: Trying to sync on semaphore...

W dodatku komenda ipcs nie pokazuje żadnych semaphore arrays...

W.T.F. ???

Ktoś ma jakis pomysł zanim zwątpię w moje zdolności programistyczne?

_______________________________

http://jawnesny.pl

  1. łeee , recydywista 20/06/08 18:06
    nie kompiluje się

    [niras: ~/tmp]$ g++ a.cpp
    a.cpp: In function &#8216;std::string timePrint()&#8217;:
    a.cpp:19: error: &#8216;memset&#8217; was not declared in this scope
    a.cpp: In function &#8216;int main(int, char**)&#8217;:
    a.cpp:45: error: &#8216;exit&#8217; was not declared in this scope
    a.cpp:49: error: &#8216;srand&#8217; was not declared in this scope
    a.cpp:54: error: &#8216;rand&#8217; was not declared in this scope
    a.cpp:54: error: &#8216;RAND_MAX&#8217; was not declared in this scope

    Computers are useless. They can only
    give you
    answers.

    1. a to dlatego , recydywista 20/06/08 18:31
      że nie masz wszystkich potrzebnych plików nagłówkowych, np cstdlib

      Computers are useless. They can only
      give you
      answers.

      1. chyba ty nie masz? , john565 20/06/08 18:55
        lol

        f*ck

  2. co szydisz , recydywista 20/06/08 19:35
    szubrawco jeden ;-)
    w sensie że nie ma ich w include'ach

    Computers are useless. They can only
    give you
    answers.

    1. miało być pod , recydywista 20/06/08 19:35
      chyba ty nie masz? , john565 20/06/08 18:55
      lol

      Computers are useless. They can only
      give you
      answers.

      1. gah , Barts_706 20/06/08 19:46
        U mnie się kompiluje ("u mnie działa") i nie brakuje mi plików nagłówkowych.

        Chodzi o to czemu nie chwyta tego p... semafora, mimo że powinien.

        Teraz piszę po raz trzeci, z wykorzystaniem boosta. Jak to nie zadziała, to mnie chyba wyp... z roboty.

        _______________________________

        http://jawnesny.pl

        1. taaa , recydywista 20/06/08 19:50
          znasz ten dowcip:
          Przychodzi informatyk do lekarza:
          -panie doktorze szwankuje mi wątroba ...
          -dziwne, u mnie działa

          a poza tym coś się strasznie zakręciłeś, co było nie tak z tymi posixowymi semaforami ? wszystko ładnie opisane tu: http://www.opcode.eu.org/c_cpp/semafory.c/

          Computers are useless. They can only
          give you
          answers.

    2. hinty , recydywista 20/06/08 19:45
      zobacz co masz pod ERRNO bezpośrednio po sem_open i sem_wait
      zobacz jakie uprawnienia ma proces (umask - przez to przepuszczane są uprawnienia semafora)
      i generalnie w ipcs chyba nie będziesz widział takich semaforów, bo to już jest biblioteka pthreads
      daj znać co tam na froncie

      Computers are useless. They can only
      give you
      answers.

      1. i jeszcze , recydywista 20/06/08 19:46
        u mnie wreszcie po dodaniu cstdlib i cstring do include'ow jest taki efekt
        [niras: ~/tmp]$ ./a.out
        0108-05-20 19:43:03 [14735]: Processing started
        0108-05-20 19:43:03 [14735]: Pass: 0
        0108-05-20 19:43:03 [14735]: Trying to get semaphore...
        0108-05-20 19:43:03 [14735]: Trying to sync on semaphore...
        i zawiecha

        Computers are useless. They can only
        give you
        answers.

    
All rights reserved ® Copyright and Design 2001-2024, TwojePC.PL