Linux线程同步------屏障

屏障是Linux中协调多个线程并行工作的同步机制,屏障允许每个线程等待直到所有的合作线程到达某一点,然后继续从该点执行,pthread_join是一种屏障但只允许一个线程等待,pthread_barrier允许任意数量的线程等待!

pthread_barrier_init(pthread_barrier_t *屏障,属性,unsigned int 屏障计数值);

pthread_barrier_wait(pthread_barrier_t *屏障):在每个线程中调用则计数值加一并将当前线程阻塞在这里,直到计数值达到初始化时设定的值;

线程屏障使用实例:

1、若对一个有800万的数组进行排序,在一个线程中完成需要很长的时间,若采用线程屏障,用8个线程分别对100万个数进行堆排序,然后在主线程中进行merge合并操作,耗时将节省6倍!

2、如下的例子是对一个800万个元素的数组进行初始化,分别采用1、4、8个线程来完成,发现采用8个线程耗时最短。

/*
程序功能:
	创建一个动态数组,给数组赋初值,创建NUM_THREAD个线程,为长度为SIZE的数组初始化,通过(线程屏障同步)
	当所有线程处理完后则打印整个数组的值。通过时间计数来比较所花费的时间。
当采用8个线程时花费sort took 0.0958 seconds
当采用四个线程时
	thread -1249961072 done job.
	thread -1260450928 done job.
	thread -1239471216 done job.
	thread -1270944880 done job.
	sort took 0.1104 seconds
当采用一个线程时
	thread -1239983216 done job.
	sort took 0.2567 seconds
*/
#include <pthread.h>
#include <stdlib.h>
#include <stdio.h>
#define SIZE 8000000L   //数组长度
#define NUM_THREAD 8 //线程个数
#define SIZE_PER (SIZE/NUM_THREAD)//每个线程要处理的数组长度
pthread_barrier_t barrier;//定义屏障
int *a;
/*每个线程的线程处理函数*/
void * thr_fun(void *arg)
{
	long n = (long)arg;
	long i;
	for(i=n;i<n+SIZE_PER;i++) {
		a[i] = i;

	}
	printf("thread %d done job.\n",pthread_self());
	pthread_barrier_wait(&barrier);
	return ((void *)1);
}

int main()
{
	pthread_t tid;
	struct timeval start,end;
	long long startusec,endusec;
	double elapsed;
	int i;
	a = (int *)malloc(SIZE*sizeof(int));  //动态分配数组
	pthread_barrier_init(&barrier,NULL,NUM_THREAD+1);//初始化线程屏障计数为子线程个数加上主线程
	gettimeofday(&start,NULL);//获得起始时间
	for(i=0;i<NUM_THREAD;i++)
	{
		pthread_create(&tid,NULL,thr_fun,(void *)(i*SIZE_PER));//创建子线程
	}
	pthread_barrier_wait(&barrier);//等待所有子线程处理完成
	gettimeofday(&end,NULL);//获得结束时间
	for(i=0;i<SIZE;i++)//打印数组内容
	//printf("%d ",a[i]);

	startusec = start.tv_sec * 1000000 +  start.tv_usec;
	endusec = end.tv_sec * 1000000 + end.tv_usec;
	elapsed = (double)(endusec-startusec)/1000000.0;//计算处理所花费的时间
	printf("sort took %.4f seconds\n",elapsed);

	return 0;
}
时间: 2024-11-02 14:03:36

Linux线程同步------屏障的相关文章

使用信号量控制Linux线程同步

线程同步 在现实生活中,有些东西就必须是按顺序执行的,只有我完成了以后,你才能在我的劳动成果上接着干:不能我还没有完成,你就开始干活了.这就是线程同步最直白的解释了. 在进行程序设计时,亦是如此.线程同步,同步的是什么?它同步的是对共享资源(内存区域,公共变量等)或者临界区域的访问.有的时候,这些共享 资源和临界区域,就只能容忍一个线程对它进行操作(读或者写,读操作一般不控制,主要是写操作),这个时候,我们必须要对这些共享资源或者临界区域进行同 步,那么如何对它们进行线程同步呢? 在Linux中

【转】 Linux 线程同步的三种方法

线程的最大特点是资源的共享性,但资源共享中的同步问题是多线程编程的难点.linux下提供了多种方式来处理线程同步,最常用的是互斥锁.条件变量和信号量. 一.互斥锁(mutex) 通过锁机制实现线程间的同步. 初始化锁.在Linux下,线程的互斥量数据类型是pthread_mutex_t.在使用前,要对它进行初始化.静态分配:pthread_mutex_t mutex = PTHREAD_MUTEX_INITIALIZER;动态分配:int pthread_mutex_init(pthread_m

linux线程同步(队列方式)

看了一些关于信号量的线程同步方式,今天用了一下. 我对于线程同步一直有疑问,在主线程和子线程处理时间不相同的时候,用这种信号量,如何保证同步. 假如主线程比较快,信号量连加了n个,但是子线程就不断减这个n,减到0.但是如果主线程太快太快,需要停一停,比如缓冲区快溢出了,主线程需要挂起. 由什么来唤醒主线程呢?子线程?不过这样的话,容易造成主线程死锁,或者主和子都卡死. 下面的程序,没有用到信号量同步,信号量只是负责开启子线程而已.主要是队列的实现而已.等我把上面的问题解决完会写上更新的程序. 队

Linux线程同步

线程同步-互斥锁 1.初始化互斥锁pthread_mutex_init() int pthread_mutex_init(pthread_mutex_t *restrict mutex, const pthread_mutexattr_t *restrict attr); 例: pthread_mutex_t mutex; pthread_mutex_init(&mutex, NULL); 2.锁住互斥锁pthread_mutex_lock() int pthread_mutex_lock(pt

Linux线程同步---信号量

首先讲一下线程同步信号量的几个关键步骤! 1.定义并初始化信号量. (1) sem_t bin_sem; (2)  res = sem_init(&bin_sem,0,0); 详细步骤可以查看man帮助页面 2.使用信号量 (1) 信号量加1操作.sem_post(&bin_sem); (2) 信号量等待并减1操作.sem_wait(&bin_sem); 初始化后一般处于等待状态,执行某个操作后加1,而另个一个操作执行前进行等待操作.如果有多个线程,通常是一个线程进行加1操作,另外

LINUX线程同步初探

0x00.什么是线程同步 同步,又称直接制约关系,是指多个线程(或进程)为了合作完成任务,必须严格按照规定的 某种先后次序来运行 0x01.案例代码 1 void* PthreadFunc(void* argc); 2 int flag_num = 1; 3 4 int main(int argc, char* argv[]) 5 { 6 pthread_t pid; 7 void* ret_val; 8 9 int create_status = pthread_create(&pid, NU

Linux 线程同步的三种方法(互斥锁、条件变量、信号量)

互斥锁 1 #include <cstdio> 2 3 #include <cstdlib> 4 5 #include <unistd.h> 6 7 #include <pthread.h> 8 9 #include "iostream" 10 11 using namespace std; 12 13 pthread_mutex_t mutex = PTHREAD_MUTEX_INITIALIZER; 14 15 int tmp; 16

linux线程同步实例

[Linux多线程]三个经典同步问题 - 神奕的专栏 - 博客频道 - CSDN.NET http://blog.csdn.net/lisonglisonglisong/article/details/45390227 Linux多进程多线程互斥同步例子_Linux编程_Linux公社-Linux系统门户网站 http://www.linuxidc.com/Linux/2013-01/78394.htm UNIX/Linux-线程控制(实例入门篇) - 菜鸟的自留地- 博客频道 - CSDN.N

linux 线程同步(二)

信号量 信号量是互斥锁的升级版把互斥锁中1变成了n,举个简单的例子:假设现在有10个人,有一部手机,这10个人都竞争来使用手机打电话这就是互斥锁.对于信号量,现在可能是有4部手机,这10个人都竞争来使用手机打电话.相比互斥锁信号量由1变成了4.信号量相也就是操作系统中pv操作,它广泛应用进程或者线程间的同步与互斥. 相关库函数介绍 #include <semaphore.h>//所需头文件 //初始化信号量sem初始化的时候可以指定信号量的初始值,以及是否可以在多进程间共享value表示要信号