cplusplus11.Examples/UNIX/ipc/posix-sem-thread.cpp
Source: cplusplus11.Examples/UNIX/ipc/posix-sem-thread.cpp
#include<iostream>
#include<unistd.h>
#include<semaphore.h>
#include<cstring>
#include<errno.h>
#include<pthread.h>
#include<fcntl.h>
sem_t s;
void error(const std::string &text);
void *tfunction(void *v) {
for(unsigned int i = 0; i < 1000; ++i) {
if(sem_wait(&s) == -1)
error("sem_wait");
std::cout << "In loop: " << i << " " << (unsigned long)v << "\n";
if(sem_post(&s) == -1)
error("sem_post");
}
return 0;
}
int main(void) {
if(sem_init(&s, 0, 1) == -1) {
std::cerr << "Error initializing semaphore: " << strerror(errno) << "\n";
exit(EXIT_FAILURE);
}
pthread_t thread1, thread2;
int rt;
rt = pthread_create(&thread1, 0, tfunction, (void*)1);
if(rt != 0)
error("pthread_create");
rt = pthread_create(&thread2, 0, tfunction, (void*)2);
if(rt != 0)
error("pthread_create");
rt = pthread_join(thread1, 0);
if(rt != 0)
error("pthread_join");
rt = pthread_join(thread2, 0);
if(rt != 0)
error("pthread_join");
return EXIT_SUCCESS;
}
void error(const std::string &text) {
std::cerr << "Error .. " << text << "\n";
exit(EXIT_FAILURE);
}