Author:DriverMonkey
Mail:bookworepeng@Hotmail.com
Phone:13410905075
QQ:196568501
以前在单片机上编程用UCOS,或其他的微内核,线程间通讯一般用以下两种方式:
- Mutexe(互斥体)
- Semaphore(信号量)
现在转战Linux 编程看POSIX线程编程接口发现线程间同步的新方式:
Barrier
应用场景:
两个或多个线程在各自某个代码点需要满足所有线程的代码都执行到对应的代码点。
如:A 线程 执行到 A_1代码点必须等到B线程执行到B_1才能往下运行
B 线程 执行到 B_1代码点必须等到B线程执行到B_1才能往下运行
测试代码如下:
#include <stdio.h>
#include <pthread.h>
#include <sched.h>
#include <assert.h>
#include <iostream>
#include <sys/time.h>
#include <unistd.h>
using namespace std;
static pthread_attr_t attr1,attr2;
static pthread_barrier_t barrier;
static void* HanMeiThread(void *p)
{
int test = 1000;
while(test--)
{
for(int count = 0; count < 1000000; count++)
;
}
cout<<"Han Mei is arring at A point!"<<endl;
pthread_barrier_wait(&barrier);
cout<<"Han Mei and LiLei are meeting at A, then together to date!"<<endl;
}
void* LiLeiThread(void *p)
{
cout<<"LiLei is arring at A point!"<<endl;
pthread_barrier_wait(&barrier);
cout<<"Lilei and Haimei are meeting at A, then together to date!"<<endl;
int test = 1000;
while(test--)
{
for(int count = 0; count < 1000000; count++)
;
}
}
int main(void)
{
pthread_t tid1,tid2;
int i;
i=getuid();
if(i==0)
printf("The current user is root\n");
else
printf("The current user is not root\n");
pthread_barrier_init(&barrier, NULL, 2);
pthread_attr_init(&attr1);
pthread_attr_init(&attr2);
pthread_create(&tid1,&attr1,HanMeiThread,NULL);
pthread_create(&tid2,&attr2,LiLeiThread,NULL);
pthread_join(tid1,NULL);
pthread_join(tid2,NULL);
pthread_attr_destroy(&attr1);
pthread_attr_destroy(&attr2);
pthread_barrier_destroy(&barrier);
return 0;
}
代码功能分析:
寒梅(HanMeiThread)和李蕾(LiLeiThread)去A地点约会。
两个人约会当然可能会出现以下三种情况:
1.寒梅先到
2.李蕾先到
3.寒梅和李蕾同时到
以上三种情况都必须要等到两个人同时出现在A地点约会才能进行,所以不管谁先到都得等到另外一个人。