POSIX 线程API 之 pthread_barrier_xxx() 使用例子

Author:DriverMonkey

Mail:[email protected]

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地点约会才能进行,所以不管谁先到都得等到另外一个人。



你可能感兴趣的:(POSIX 线程API 之 pthread_barrier_xxx() 使用例子)