Pthread barrier的简单使用示例:
C++代码如下:
// ThreadingLoadImages.cpp : 定义控制台应用程序的入口点。
//
#include "stdafx.h"
#include <pthread.h>
#include <opencv2/opencv.hpp>
#define THREADS 3
// Barrier variable
pthread_barrier_t barr;
struct Param
{
cv::Mat img;
int index;
char* file_path;
} params[THREADS];
void* entry_point(void* arg)
{
Param* p = (Param*)arg;
int index = p->index;
char* file_path = p->file_path;
p->img = cv::imread(file_path);
printf("The %d thread is doing job! \n", index);
// Synchronization point
int rc = pthread_barrier_wait(&barr);
if (rc != 0 && rc != PTHREAD_BARRIER_SERIAL_THREAD)
{
printf("Could not wait on barrier\n");
exit(-1);
}
}
int main()
{
pthread_t thr[THREADS];
//pthread_mutex_init(&g_mtx, NULL);
// Barrier initialization
if (pthread_barrier_init(&barr, NULL, THREADS))
{
printf("Could not create a barrier\n");
return -1;
}
//int t[THREADS];
params[0].file_path = "../micky.png";
params[1].file_path = "../umbrella.png";
params[2].file_path = "../beard.jpg";
for (int i = 0; i < THREADS; ++i)
{
//t[i] = i;
params[i].index = i;
if (pthread_create(&thr[i], NULL, &entry_point, (void *)¶ms[i]))
{
printf("Could not create thread %d\n", i);
return -1;
}
}
for (int i = 0; i < THREADS; ++i)
{
if (pthread_join(thr[i], NULL))
{
printf("Could not join thread %d\n", i);
return -1;
}
}
printf("All threads finish jobs! \n");
for(int i=0; i<THREADS; i++)
cv::imshow(params[i].file_path, params[i].img);
cv::waitKey(0);
return 0;
}
效果如图:
相关资料:
pthread线程使用小结