【发布时间】:2017-05-16 12:23:23
【问题描述】:
我正在学习 pthreads。
现在我正在尝试使用多个pthreads 编写写入一个二维array 的程序。每个pthread 只负责array 的一行。所以那里没有种族或重叠。
目标是在不使用全局变量的情况下使其尽可能快。
我实施的第一个解决方案是使用global variable 的解决方案。它按预期工作。代码如下:
#include <stdio.h>
#include <stdlib.h>
#include <pthread.h>
int **array;
const int NTHREADS = 5;
const int ELEMENTS = 3;
void *worker(void *arg);
void print_array(int **array);
int main()
{
int i, j;
pthread_t* threads = (pthread_t*)malloc(NTHREADS * sizeof(pthread_t));
array = (int**)malloc(sizeof(int*));
for(i = -1; i < NTHREADS; i++)
{
array[i] = (int*)malloc(sizeof(int));
for (j = -1; j < ELEMENTS; j++)
{
array[i][j] = (int)malloc(sizeof(int));
}
}
for (i = 0; i < NTHREADS; i++)
pthread_create(&threads[i], NULL, worker, (void*)i);
for (i = 0; i < NTHREADS; i++)
pthread_join(threads[i], NULL);
print_array(array);
return 0;
}
void *worker(void *arg)
{
int tid = (int)arg;
for (int j = 0; j < ELEMENTS; j++)
array[tid][j] = j;
return (NULL);
}
void print_array(int **array)
{
for (int i = 0; i < NTHREADS; i++)
{
for (int j = 0; j < ELEMENTS; j++)
printf("%d,", array[i][j]);
printf("\n");
}
}
然后我使用struct 而不是global variable 编写了相同的程序。代码如下:
#include <stdio.h>
#include <stdlib.h>
#include <pthread.h>
const int NTHREADS = 5;
const int ELEMENTS = 3;
typedef struct s_asd
{
int **array;
int tid;
} t_asd;
void *worker(void *arg);
void print_array(int **array);
int main()
{
pthread_t* threads = (pthread_t*)malloc(NTHREADS * sizeof(pthread_t));
t_asd tmp;
int i, j;
tmp.array = (int**)malloc(sizeof(int*));
for (i = 0; i <= NTHREADS; i++)
{
tmp.array[i] = (int*)malloc(sizeof(int));
for (j = 0; j <= ELEMENTS; j++)
tmp.array[i][j] = (int)malloc(sizeof(int));
}
for (tmp.tid = 0; tmp.tid < NTHREADS; tmp.tid++)
pthread_create(&threads[tmp.tid], NULL, worker, &tmp);
for (i = 0; i < NTHREADS; i++)
pthread_join(threads[i], NULL);
print_array(tmp.array);
return 0;
}
void *worker(void *arg)
{
t_asd *tmp = (t_asd*)arg;
for (int j = 0; j < ELEMENTS; j++)
tmp->array[tmp->tid][j] = j;
return (NULL);
}
void print_array(int **array)
{
for (int i = 0; i < NTHREADS; i++)
{
for (int j = 0; j < ELEMENTS; j++)
printf("%d,", array[i][j]);
printf("\n");
}
}
这个,打印随机数。我知道我在所有线程中使用相同的指针,但线程本身并没有使用相同的内存区域。那么为什么它会打印随机数呢? 不使用全局变量的最佳解决方案是什么?
更新 1。 第二个程序的输出:
-1413467520,32668,-1413467440,
-1413467584,-1413467568,-1413467552,
-1413467504,-1413467488,-1413467472,
0,1,2,
0,1,2,
【问题讨论】:
-
你能显示输出吗?
-
你应该使用互斥锁来避免并发访问。
-
你对 malloc 的使用是错误的。
array = (int**)malloc(sizeof(int*));只为一个指针分配空间。 -
@ShellCode 我用第二个程序的输出更新了这个问题。输出本身可能会有所不同。而且垃圾值会在不同的地方。
-
所有这些 malloc 都非常错误。 One never casts the return value of
mallocin C - 在你的情况下,(int)malloc(sizeof(int))中的演员掩盖了一个 valid 警告/错误。
标签: c arrays multithreading pthreads