关于具有多个参数的进程的 c:pthread

pthread for processes with more than one parameter

我目前正在创建一个使用线程处理 BMP 图像的程序。问题是......我知道 pthread 使用函数的签名作为 arg 4......但是如果函数需要超过 1 个参数,我怎么能创建一个线程呢?

这是函数所需的结构:

1
2
3
4
5
6
7
typedef struct {
HEADER header;
INFOHEADER infoheader;
PIXEL *pixel;
} IMAGE;

IMAGE imagenfte,imagendst;

功能代码如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
void *processBMP(IMAGE *imagefte, IMAGE *imagedst)
{
int i,j;
int count=0;
PIXEL *pfte,*pdst;
PIXEL *v0,*v1,*v2,*v3,*v4,*v5,*v6,*v7;
int imageRows,imageCols;
memcpy(imagedst,imagefte,sizeof(IMAGE)-sizeof(PIXEL *));
imageRows = imagefte->infoheader.rows;
imageCols = imagefte->infoheader.cols;
imagedst->pixel=(PIXEL *)malloc(sizeof(PIXEL)*imageRows*imageCols);
for(i=1;i<imageRows-1;i++){
for(j=1;j<imageCols-1;j++)
{
pfte=imagefte->pixel+imageCols*i+j;
v0=pfte-imageCols-1;
v1=pfte-imageCols;
v2=pfte-imageCols+1;
v3=pfte-1;
v4=pfte+1;
v5=pfte+imageCols-1;
v6=pfte+imageCols;
v7=pfte+imageCols+1;
pdst=imagedst->pixel+imageCols*i+j;
...
}

...
int main()
{
int res;

///////Variables a utilizar en Hilo///////
int procBMP_t;  //Variable entera para la creaci?3n de los hilos
pthread_t proc_t;  //Hilo para el procesamiento del BMP
//////////////////////////////////////////

...
procBMP_t = pthread_create(&proc_t, NULL, processBMP, (void *) &imgsSENT);  //Hilo para el procesamiento de imagenes

我试着用这个来解决它:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
struct threadImgs{   //Estructura para enviar ambas imagenes como argumento del thread
IMAGE fuente;
IMAGE destino;
};

struct threadImgs imgsSENT;


void *processBMP(void *imgs)
{

struct threadImgs* imagen = (struct threadImgs *) imgs;

IMAGE *imagefte = imagen->fuente;
IMAGE *imagedst = imagen->destino;
....
}

但它并没有真正的帮助,甚至无法编译由于"初始化类型结构错误时不兼容的类型"

任何帮助 D:???


您将两个参数package到一个结构中的方法是要走的路。

但请注意类型:

1
2
3
4
5
struct threadImgs
{  
  IMAGE fuente;
  IMAGE destino;
};

上面的结构定义它的元素是 IMAGE.

的实例

您的线程函数尝试访问指向 IMAGE:

的指针

1
2
3
4
5
6
7
8
void *processBMP(void *imgs)
{
  struct threadImgs* imagen = (struct threadImgs *) imgs;

  IMAGE *imagefte = imagen->fuente;
  IMAGE *imagedst = imagen->destino;

  ...

所以要么改变结构体将其元素定义为指针:

1
2
3
4
5
struct threadImgs
{  
  IMAGE * fuente;
  IMAGE * destino;
};

或者改变线程函数不拉指针:

1
2
3
4
5
6
7
8
void *processBMP(void *imgs)
{
  struct threadImgs * imagen = (struct threadImgs *) imgs;

  IMAGE imagefte = imagen->fuente;
  IMAGE imagedst = imagen->destino;

  ...