|
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.
|
|
|
|
|
|
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 - łeee , recydywista 20/06/08 18:06
nie kompiluje się
[niras: ~/tmp]$ g++ a.cpp
a.cpp: In function ‘std::string timePrint()’:
a.cpp:19: error: ‘memset’ was not declared in this scope
a.cpp: In function ‘int main(int, char**)’:
a.cpp:45: error: ‘exit’ was not declared in this scope
a.cpp:49: error: ‘srand’ was not declared in this scope
a.cpp:54: error: ‘rand’ was not declared in this scope
a.cpp:54: error: ‘RAND_MAX’ was not declared in this scopeComputers are useless. They can only
give you
answers. - a to dlatego , recydywista 20/06/08 18:31
że nie masz wszystkich potrzebnych plików nagłówkowych, np cstdlibComputers are useless. They can only
give you
answers. - chyba ty nie masz? , john565 20/06/08 18:55
lolf*ck
- co szydisz , recydywista 20/06/08 19:35
szubrawco jeden ;-)
w sensie że nie ma ich w include'achComputers are useless. They can only
give you
answers. - miało być pod , recydywista 20/06/08 19:35
chyba ty nie masz? , john565 20/06/08 18:55
lolComputers are useless. They can only
give you
answers. - 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 - 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.
- 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 froncieComputers are useless. They can only
give you
answers. - 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 zawiechaComputers are useless. They can only
give you
answers.
|
|
|
|
|
All rights reserved ® Copyright and Design 2001-2024, TwojePC.PL |
|
|
|
|