[Qt-interest] :QSystemSemaphore::acquire return false with error QSystemSemaphore::OutOfResources after 32767 pair of (release/acquire)

Dong Tiger idlecat511 at gmail.com
Mon Aug 24 15:53:30 CEST 2009


Anyone bother taking a look? Or I will just fire a bug.

2009/8/24 Dong Tiger <idlecat511 at gmail.com>

> Hi,
>
> I used QSystemSemaphore to solve producer/consumer problem in my program. I
> found a strange problem.
> After 32767 acquire operations,  the semaphore stopped working. Acquiring
> this semaphore returned false
> with error QSystemSemaphore::OutOfResources.
>
> I wrote a simple program to demonstrate the problem.You can try it by:
>   $./a.out c  (start the consumer)
>   $./a.out p  (start the producer)
>
> Then you will see producer will exit after producing 32767 products with
> error
> QSystemSemaphore::OutOfResources. My environment is ubuntu8.04 + (Qt4.4.0 |
> Qt4.5.2).
>
> <code>
> #include <stdint.h>
> #include <signal.h>
> #include <unistd.h>
> #include <fcntl.h>
> #include <iostream>
> #include <QSystemSemaphore>
> #include <QCoreApplication>
>
> static const char *kSemKeyWrite = "TestSemWrite";
> static const char *kSemKeyRead = "TestSemRead";
> static const int kWriteNum = 1000;
> static QSystemSemaphore *sem_read;
> static QSystemSemaphore *sem_write;
> static uint32_t count = 0;
> bool pause_flag = false;
>
> static void SignalHandler(int sig) {
>   if (pause_flag) {
>     std::cout << "Resume\n";
>   } else {
>     std::cout << "Pause:" << count << "\n";
>   }
>   pause_flag = !pause_flag;
> }
>
> int main(int argc, char **argv) {
>   if (argc == 1) {
>     std::cout << "Please specify mode(p(producer) or c(cousumer)\n";
>     return 1;
>   }
>   signal(SIGINT, SignalHandler);
>   if (argv[1][0] == 'c') {
>     sem_read = new QSystemSemaphore(kSemKeyRead, 0,
> QSystemSemaphore::Create);
>     sem_write = new QSystemSemaphore(kSemKeyWrite,
>                                      kWriteNum,
>                                      QSystemSemaphore::Create);
>
>     // for (int i = 0; i < 20000; i++) {
>     while (1) {
>       if (!sem_read->acquire()) {
>         std::cout << sem_read->errorString().toUtf8().data() << ":" <<
> count << "\n";
>         if (sem_read->error()!= QSystemSemaphore::OutOfResources) continue;
>         return 1;
>       }
>       sem_write->release();
>       count++;
>       if ((count % 10000) == 0) {
>         std::cout << "P:" << count << "\n";
>       }
>       while (pause_flag) {
>         usleep(100000);
>       }
>     }
>   } else {
>     sem_read = new QSystemSemaphore(kSemKeyRead);
>     sem_write = new QSystemSemaphore(kSemKeyWrite);
>     // for (int i = 0; i < 10000 + kWriteNum; i++) {
>     while (1) {
>       while(!sem_write->acquire()) {
>         std::cout << sem_write->errorString().toUtf8().data() << ":" <<
> count << "\n";
>         if (sem_write->error()!= QSystemSemaphore::OutOfResources)
> continue;
>         return 1;
>       }
>       sem_read->release();
>       count++;
>       if ((count % 10000) == 0) {
>         std::cout << "C:" << count << "\n";
>       }
>       while (pause_flag) {
>         usleep(100000);
>       }
>     }
>   }
>   return 0;
> }
>
> </code>
>
-------------- next part --------------
An HTML attachment was scrubbed...
URL: http://lists.qt-project.org/pipermail/qt-interest-old/attachments/20090824/9948fee8/attachment.html 


More information about the Qt-interest-old mailing list