#include <iostream>
#include <unistd.h>
#include <pthread.h>
using namespace std;
int g_val = 100;
pthread_mutex_t mutex;
pthread_cond_t condition;
pthread_mutex_t c_mutex;
void* sonThreadFunc(void* param)
{
usleep(1000);
pthread_mutex_lock(&c_mutex);
std::cout << pthread_self() << " " << *(int *)param << std::endl;
pthread_cond_signal(&condition);
pthread_mutex_unlock(&c_mutex);
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);
pthread_cond_init(&condition, NULL);
pthread_t tid[20];
for(size_t i = 0; i < 20; i++)
{
if(pthread_create(&tid[i], NULL, sonThreadFunc, &i) != 0)
{
break;
}
pthread_mutex_lock(&c_mutex);
pthread_cond_wait(&condition, &c_mutex);
pthread_mutex_unlock(&c_mutex);
}
for(size_t i = 0; i < 20; i++)
{
pthread_join(tid[i], NULL);
}
pthread_cond_destroy(&condition);
pthread_mutex_destroy(&mutex);
pthread_mutex_destroy(&c_mutex);
cout << "Hello World!" << endl;
return 0;
}