Business
Jobs
  • About Us
  • Solutions
    • Job Postings
      Post your job and receive qualified candidates in 48h.
    • Candidate Assessments
      500+ technical and psychological tests, plus anti-fraud.
    • Headhunting
      Tailor-made executive search from start to finish.
    • Payroll + EOR
      Payroll dispersal and EOR across 15+ LATAM countries.
  • Pricing
  • Jobs

0

239
Views
Port program that uses CreateEvent and WaitForMultipleObjects to Linux

I need to port a multiprocess application that uses the Windows API functions SetEvent, CreateEvent and WaitForMultipleObjects to Linux. I have found many threads concerning this issue, but none of them provided a reasonable solution for my problem.

I have an application that forks into three processes and manages thread workerpool of one process via these Events.

I had multiple solutions to this issue. One was to create FIFO special files on Linux using mkfifo on linux and use a select statement to awaken the threads. The Problem is that this solution will operate differently than WaitForMultipleObjects. For Example if 10 threads of the workerpool will wait for the event and I call SetEvent five times, exactly five workerthreads will wake up and do the work, when using the FIFO variant in Linux, it would wake every thread, that i in the select statement and waiting for data to be put in the fifo. The best way to describe this is that the Windows API kind of works like a global Semaphore with a count of one.

I also thought about using pthreads and condition variables to recreate this and share the variables via shared memory (shm_open and mmap), but I run into the same issue here!

What would be a reasonable way to recreate this behaviour on Linux? I found some solutions doing this inside of a single process, but what about doing this with between multiple processes?

Any ideas are appreciated (Note: I do not expect a full implementation, I just need some more ideas to get myself started with this problem).

over 4 years ago · Santiago Trujillo
1 answers
Answer question

0

You could use a semaphore (sem_init), they work on shared memory. There's also named semaphores (sem_open) if you want to initialize them from different processes. If you need to exchange messages with the workers, e.g. to pass the actual tasks to them, then one way to resolve this is to use POSIX message queues. They are named and work inter-process. Here's a short example. Note that only the first worker thread actually initializes the message queue, the others use the attributes of the existing one. Also, it (might) remain(s) persistent until explicitly removed using mq_unlink, which I skipped here for simplicity.

Receiver with worker threads:

// Link with -lrt -pthread

#include <fcntl.h>
#include <mqueue.h>
#include <pthread.h>
#include <stdio.h>
#include <unistd.h>

void *receiver_thread(void *param) {
    struct mq_attr mq_attrs = { 0, 10, 254, 0 };

    mqd_t mq = mq_open("/myqueue", O_RDONLY | O_CREAT, 00644, &mq_attrs);
    if(mq < 0) {
        perror("mq_open");
        return NULL;
    }
    char msg_buf[255];
    unsigned prio;

    while(1) {
        ssize_t msg_len = mq_receive(mq, msg_buf, sizeof(msg_buf), &prio);
        if(msg_len < 0) {
            perror("mq_receive");
            break;
        }
        msg_buf[msg_len] = 0;
        printf("[%lu] Received: %s\n", pthread_self(), msg_buf);
        sleep(2);
    }
}

int main() {
    pthread_t workers[5];
    for(int i=0; i<5; i++) {
        pthread_create(&workers[i], NULL, &receiver_thread, NULL);
    }
    getchar();
}

Sender:

#include <fcntl.h>
#include <stdio.h>
#include <mqueue.h>
#include <unistd.h>

int main() {
    mqd_t mq = mq_open("/myqueue", O_WRONLY);
    if(mq < 0) {
        perror("mq_open");
    }
    char msg_buf[255];
    unsigned prio;

    for(int i=0; i<255; i++) {
        int msg_len = sprintf(msg_buf, "Message #%d", i);
        mq_send(mq, msg_buf, msg_len, 0);
        sleep(1);
    }
}
over 4 years ago · Santiago Trujillo Report
Answer question
Find remote jobs

Discover the new way to find a job!

Top jobs
Top job categories
Business
Post vacancy Pricing Sales
Legal
Terms and conditions Privacy policy
© 2026 PeakU Inc. All Rights Reserved.
Andres GPT
Show me some job opportunities
There's an error!