//pthread_mutex_trylock非阻塞时互斥锁
#include <iostream>
#include <pthread.h>
#include <ctime>
#include "errors.h"
#define sun
using namespace std;
pthread_mutex_t mutex=PTHREAD_MUTEX_INITIALIZER;
const int SPIN=100;
long counter;
time_t end_time;
void *pthread_counter_thread(void*)
{
while(time(NULL)<end_time)
{
int status=pthread_mutex_lock(&mutex);
if(status)
err_abort(status,"Lock mutex");
for(int spin=0;spin<SPIN;++spin)
counter++;
status=pthread_mutex_unlock(&mutex);
if(status)
err_abort(status,"Unlock mutex");
sleep(1);
}
cout<<"Counter is :"<<counter<<endl;
return NULL;
}
void *pthread_monitor_thread(void *)
{
int status,misses=0;
while(time(NULL)<end_time)
{
sleep(3);
status=pthread_mutex_trylock(&mutex);
if(status!=EBUSY)
{
if(status!=0)
err_abort(status,"Trylock mutex");
cout<<"Pthread_mutex_trylock,Counter is :" <<counter/SPIN<<endl;
status=pthread_mutex_unlock(&mutex);
if(status!=0)
err_abort(status,"Unlock mutex");
}
else
misses++;
cout<<"Moniter thread missed update :"<<misses<<"times."<<endl;
return NULL;
}
}
int main()
{
#ifdef sun
cout<<"Setting concurrency level to 2"<<endl;
pthread_setconcurrency(2);
#endif
pthread_t pthread_counter_id,pthread_monitor_id;
end_time=time(NULL)+60;
//创建 pthread_counter_thread
int status=pthread_create(&pthread_counter_id,NULL,pthread_counter_thread,NULL);
if(status)
err_abort(status,"Create counter thread");
//创建 pthread_monitor_thread
status=pthread_create(&pthread_monitor_id,NULL,pthread_monitor_thread,NULL);
if(status)
err_abort(status,"Create monitor thread");
//连接 pthread_counter_thread
status=pthread_join(pthread_counter_id,NULL);
if(status)
err_abort(status,"Join counter thread");
//连接 pthread_monitor_thread
status=pthread_join(pthread_monitor_id,NULL);
if(status)
err_abort(status,"Join monitor thread");
return 0;
}