#include <iostream>
#include <unistd.h>
#include <pthread.h>
#include <semaphore.h>
int g_val = 100;
pthread_mutex_t mutex;
sem_t sem;
pthread_mutex_t c_mutex;
void* sonThreadFunc(void* param)
{
usleep(1000);
std::cout << pthread_self() << " " << *(int *)param << std::endl;
sem_post(&sem);
usleep(1000);
pthread_mutex_lock(&mutex);
++g_val;
std::cout << pthread_self() << " " << g_val << std::endl;
pthread_mutex_unlock(&mutex);
return NULL;
}
int main()
{
pthread_mutex_init(&mutex, NULL);
pthread_mutex_init(&c_mutex, NULL);
sem_init(&sem, 0, 0);
pthread_t tid[20];
for(size_t i = 0; i < 20; i++)
{
if(pthread_create(&tid[i], NULL, sonThreadFunc, &i) != 0)
{
break;
}
sem_wait(&sem);
}
for(size_t i = 0; i < 20; i++)
{
pthread_join(tid[i], NULL);
}
pthread_mutex_destroy(&mutex);
pthread_mutex_destroy(&c_mutex);
sem_destroy(&sem);
std::cout << "Hello World!" << std::endl;
return 0;
}