C++中的POSIX线程编程

Posted

技术标签:

【中文标题】C++中的POSIX线程编程【英文标题】:POSIX thread Programming in C++ 【发布时间】:2012-07-06 06:22:31 【问题描述】:

我正在尝试使用pthreads添加两个矩阵。只是一个初学者程序,但我无法使用线程初始化矩阵。我的代码sn-p如下:

#include "test.h"

CvMat * matA;       /* first matrix */
CvMat * matB;       /* second matrix */
CvMat * matRes;     /* result matrix */

int size_x_a; /* this variable will be used for the first  dimension */
int size_y_a; /* this variable will be used for the second dimension */

int size_x_b,size_y_b;
int size_x_res;
int size_y_res;

int main()

/* assigining the values of sizes */
size_x_a = 200;
size_y_a = 200;
size_x_b = 200;
size_y_b = 200;

/* resultant matrix dimensions */
size_x_res = size_x_a;
size_y_res = size_y_b;

matA = cvCreateMat(size_x_a,size_y_a,CV_32SC1);
matB = cvCreateMat(size_x_b,size_y_b,CV_32SC1);
matRes = cvCreateMat(size_x_res,size_y_res,CV_32SC1);

pthread_t thread1;
pthread_t thread2;

int res1;
int res2;
 /*******************************************************************************/ 

    /*Creating a thread*/
res1 = pthread_create(&thread1,NULL,initializeA,(void*)matA);
if(res1!=0)

    perror("thread creation of thread1 failed");
    exit(EXIT_FAILURE);


for(int i =0;i<size_x_a;i++)

    for(int j = 0;j<size_y_a;j++)
    
        printf("%d ",cvmGet(matA,i,j));
    

    /*Creating a thread*/
res2 = pthread_create(&thread2,NULL,initializeB,(void*)matB);

if(res2!=0)

    perror("thread creation of thread2 failed");
    exit(EXIT_FAILURE);

return 0;
 

void * initializeA(void * arg)

CvMat * matA  = (CvMat*)arg;
//matA = (CvMat*)malloc(size_x_a * sizeof(CvMat *));

/*initialiazing random values*/
for (int i = 0; i < size_x_a; i++) 

    for (int j = 0; j < size_y_a; j++) 
    
        cvmSet(matA,i,j,size_y_a + j); 
    

return 0;


void * initializeB(void * arg)

CvMat* matB  = (CvMat*)arg;
//matB = (CvMat*)malloc(size_x_b * sizeof(CvMat *));

/*initialiazing random values*/
for (int i = 0; i < size_x_b; i++) 

    for (int j = 0; j < size_y_b; j++) 
    
      cvmSet(matB,i,j,size_y_b + j); 
    

return 0;

我首先创建了两个线程来初始化CvMat矩阵。CvMat矩阵是opencv的。 初始化并调用 pthread_create 后,我试图访问 CvMat 的数据,但它崩溃了,这意味着它没有初始化。

请推荐。

谢谢

【问题讨论】:

如果您在Ares1 = pthread_create(&amp;thread1,NULL,initializeA,(void*)matA); 行之前测试matA 是否为NULL,结果是什么? 这很可能是一个你必须使用pthreads的练习,但请记住,在现代C++中应该使用&lt;thread&gt;&lt;mutex&gt;。所有主要编译器的最新版本(gcc 4.6+、clang 3.0+、MSVC 2010+)都支持它。 @Yannick Blondeau:不,它不是 NULL,它有一些地址。 @J.N. : android.. 支持吗?? @J.N.: &lt;thread&gt;&lt;mutex&gt; 在 MSVC 2010 中不受支持,但在 MSVC 2012 中支持(我不确定如何完全)。 【参考方案1】:

显然要等到初始化完成后才能使用。

pthread_create(&thr1, ..., (void *)matA);
pthread_create(&thr2, ..., (void *)matB);

pthread_join(thr1, &result1);
pthread_join(thr2, &result2);

for (...)  ... cvmGet(matA,i,j); ... 

就目前而言,您正试图在初始化期间访问矩阵。

【讨论】:

以上是关于C++中的POSIX线程编程的主要内容,如果未能解决你的问题,请参考以下文章

Linux C与C++一线开发实践之六 多线程高级编程

两种 C++ 多线程编程方式,看完不懂打我...

两种 C++ 多线程编程方式,看完不懂打我...

linux网络编程-posix条件变量(40)

POSIX 多线程编程及理解

转载:Posix线程编程指南