System and device programming——thread and semaphore implements
2016-03-14 04:22
423 查看
A turnstile, also called a baffle gate, is a form of gate which allows one person to pass at a time.
When have k threads dividing into 2 phases,second must wait first finishes,can do this way:
typedef struct {
int count;
pthread_mutex_t mutex;
} Counter;
Counter *c;
int num_threads;
static void *
code (void *arg){
int i;
pthread_detach (pthread_self ());
sleep(random() % 5);
printf("%ld, 1\n", pthread_self());
pthread_mutex_lock (&c->mutex);
c->count++;
if (c->count == num_threads) //last 1 waits all the other,including itself.to post k signals,then can let all sem_wait get signals.
for (i=0;i<num_threads)
sem_post(barrier);
pthread_mutex_unlock (&c->mutex); //all need this
sem_wait(barrier);
printf("%ld, 2\n", pthread_self());
return 0;
}
2.another good way:
typedef struct {
int count;
pthread_mutex_t mutex;
} Counter;
Counter *c;
int num_threads;
static void *
code (void *arg){
pthread_detach (pthread_self ());
sleep(random() % 5);
printf("%ld, 1\n", pthread_self());
pthread_mutex_lock (&c->mutex);
c->count++;
if (c->count == num_threads)
sem_post(barrier);
pthread_mutex_unlock (&c->mutex);
sem_wait(barrier); // turnstile -|-
sem_post(barrier);// one who gets barrier will release next,i.e.only one can enter each time
printf("%ld, 2\n", pthread_self());
return 0;
}
For cyclic way
typedef struct {
int count;
pthread_mutex_t mutex;
} Counter;
Counter *c;
int num_threads;
static void *
code (void *arg){
int i, j, r;
pthread_detach (pthread_self ());
for (i=0;i<10;i++){
r = random() % 5;
sleep(r);
printf("%ld slept %d sec in phase 1\n", pthread_self(), r);
pthread_mutex_lock (&c->mutex);
c->count++;
if (c->count == num_threads)
for (j=0;j<num_threads;j++)
sem_post(barrier1);
pthread_mutex_unlock (&c->mutex);
sem_wait(barrier1);
printf("%ld phase 2\n", pthread_self());
pthread_mutex_lock (&c->mutex);//phase 2 same way with previous
c->count--;
if (c->count == 0)
for (j=0;j<num_threads;j++)
sem_post(barrier2);
pthread_mutex_unlock (&c->mutex);
sem_wait(barrier2);
}
return 0;
}
When have k threads dividing into 2 phases,second must wait first finishes,can do this way:
typedef struct {
int count;
pthread_mutex_t mutex;
} Counter;
Counter *c;
int num_threads;
static void *
code (void *arg){
int i;
pthread_detach (pthread_self ());
sleep(random() % 5);
printf("%ld, 1\n", pthread_self());
pthread_mutex_lock (&c->mutex);
c->count++;
if (c->count == num_threads) //last 1 waits all the other,including itself.to post k signals,then can let all sem_wait get signals.
for (i=0;i<num_threads)
sem_post(barrier);
pthread_mutex_unlock (&c->mutex); //all need this
sem_wait(barrier);
printf("%ld, 2\n", pthread_self());
return 0;
}
2.another good way:
typedef struct {
int count;
pthread_mutex_t mutex;
} Counter;
Counter *c;
int num_threads;
static void *
code (void *arg){
pthread_detach (pthread_self ());
sleep(random() % 5);
printf("%ld, 1\n", pthread_self());
pthread_mutex_lock (&c->mutex);
c->count++;
if (c->count == num_threads)
sem_post(barrier);
pthread_mutex_unlock (&c->mutex);
sem_wait(barrier); // turnstile -|-
sem_post(barrier);// one who gets barrier will release next,i.e.only one can enter each time
printf("%ld, 2\n", pthread_self());
return 0;
}
For cyclic way
typedef struct {
int count;
pthread_mutex_t mutex;
} Counter;
Counter *c;
int num_threads;
static void *
code (void *arg){
int i, j, r;
pthread_detach (pthread_self ());
for (i=0;i<10;i++){
r = random() % 5;
sleep(r);
printf("%ld slept %d sec in phase 1\n", pthread_self(), r);
pthread_mutex_lock (&c->mutex);
c->count++;
if (c->count == num_threads)
for (j=0;j<num_threads;j++)
sem_post(barrier1);
pthread_mutex_unlock (&c->mutex);
sem_wait(barrier1);
printf("%ld phase 2\n", pthread_self());
pthread_mutex_lock (&c->mutex);//phase 2 same way with previous
c->count--;
if (c->count == 0)
for (j=0;j<num_threads;j++)
sem_post(barrier2);
pthread_mutex_unlock (&c->mutex);
sem_wait(barrier2);
}
return 0;
}
相关文章推荐
- java-模拟tomcat服务器
- C#多线程之Thread中Thread.IsAlive属性用法分析
- C#通过Semaphore类控制线程队列的方法
- Android开发笔记之:如何安全中止一个自定义线程Thread的方法
- java thread start()和run()方法简析
- Java中Runnable和Thread的区别分析
- Android开发笔记之:Handler Runnable与Thread的区别详解
- C#多线程之Thread中Thread.Join()函数用法分析
- Mysql Error Code : 1436 Thread stack overrun
- MySQL错误Forcing close of thread的两种解决方法
- c#线程Thread示例
- C#使用semaphore来管理异步下载请求的方法
- Android线程管理之ActivityThread
- Android 关于“NetworkOnMainThreadException”问题的原因分析及解决办法
- Python多线程同步Lock、RLock、Semaphore、Event实例
- JAVA 多线程之信号量(Semaphore)实例详解
- Java之Thread的join方法实例
- java中thread线程start和run的区别
- JAVA多线程Thread和Runnable的实现
- Java线程编程中Thread类的基础学习教程