不知道长度的二维全局数组。最佳实践?
2D global array without knowing lengths. Best practice?
我需要有缓冲区,我将在多个不同类型的线程中使用它。所以数组需要是全局的。
缓冲区大小和缓冲区数量作为程序的输入。
作为替代方案,我也许可以实现链表。
实现此类缓冲区的最佳方法是什么?你能提供样品吗?
感谢任何帮助!
我不明白你说的 "without knowing length" 是什么意思,如果你将每个缓冲区的大小和缓冲区的数量作为输入参数传递,那么你就知道每个需要的长度。
也许这不是最好的,但那是我的方式。
首先声明全局缓冲区和线程。
static void ** buffer;
pthread_t tid[2];
这里描述了线程是如何工作的。第一缓冲区将分配数据前两个子缓冲区。第二个将对其他两个做同样的事情。
void *assignBuffer(void *threadid) {
pthread_t id = pthread_self();
if (pthread_equal(id, tid[0])) {
strcpy(buffer[0], "foo");
strcpy(buffer[1], "bar");
} else {
strcpy(buffer[2], "oof");
strcpy(buffer[3], "rab");
}
return NULL;
}
- 正在将程序参数从字符串转换为整数。
- 这里我们用未知类型的数组分配缓冲区。
- 这里我们为每个缓冲区分配其大小(以字节为单位)。
- 最后我们创建了工作线程。重要的是他们
将同时运行。
- 等待所有线程完成它们的工作。
- 简单打印缓冲区内容。
好的,这是代码。
int main(int argc, char **argv) {
//1
int bufferSize = atoi(argv[1]);
int buffersAmount = atoi(argv[2]);
//2
buffer = malloc(sizeof(void *)*buffersAmount);
//3
int i;
for (i = 0; i < buffersAmount; ++i) {
buffer[i] = malloc(bufferSize);
}
//4
i = 0;
while (i < 2) {
pthread_create(&tid[i], NULL, &assignBuffer, NULL);
++i;
}
//5
for (i = 0; i < 2; i++)
pthread_join(tid[i], NULL);
//6
for (i = 0; i < 4; ++i) {
printf("%d %s\n", i, (char*)buffer[i]);
}
for (i = 0; i < buffersAmount; ++i) {
free(buffer[i]);
}
return 0;
}
如果您有什么不明白的地方,请随时询问,也很抱歉我的英语不是我的母语。
我需要有缓冲区,我将在多个不同类型的线程中使用它。所以数组需要是全局的。
缓冲区大小和缓冲区数量作为程序的输入。
作为替代方案,我也许可以实现链表。
实现此类缓冲区的最佳方法是什么?你能提供样品吗?
感谢任何帮助!
我不明白你说的 "without knowing length" 是什么意思,如果你将每个缓冲区的大小和缓冲区的数量作为输入参数传递,那么你就知道每个需要的长度。
也许这不是最好的,但那是我的方式。
首先声明全局缓冲区和线程。
static void ** buffer;
pthread_t tid[2];
这里描述了线程是如何工作的。第一缓冲区将分配数据前两个子缓冲区。第二个将对其他两个做同样的事情。
void *assignBuffer(void *threadid) {
pthread_t id = pthread_self();
if (pthread_equal(id, tid[0])) {
strcpy(buffer[0], "foo");
strcpy(buffer[1], "bar");
} else {
strcpy(buffer[2], "oof");
strcpy(buffer[3], "rab");
}
return NULL;
}
- 正在将程序参数从字符串转换为整数。
- 这里我们用未知类型的数组分配缓冲区。
- 这里我们为每个缓冲区分配其大小(以字节为单位)。
- 最后我们创建了工作线程。重要的是他们 将同时运行。
- 等待所有线程完成它们的工作。
- 简单打印缓冲区内容。
好的,这是代码。
int main(int argc, char **argv) {
//1
int bufferSize = atoi(argv[1]);
int buffersAmount = atoi(argv[2]);
//2
buffer = malloc(sizeof(void *)*buffersAmount);
//3
int i;
for (i = 0; i < buffersAmount; ++i) {
buffer[i] = malloc(bufferSize);
}
//4
i = 0;
while (i < 2) {
pthread_create(&tid[i], NULL, &assignBuffer, NULL);
++i;
}
//5
for (i = 0; i < 2; i++)
pthread_join(tid[i], NULL);
//6
for (i = 0; i < 4; ++i) {
printf("%d %s\n", i, (char*)buffer[i]);
}
for (i = 0; i < buffersAmount; ++i) {
free(buffer[i]);
}
return 0;
}
如果您有什么不明白的地方,请随时询问,也很抱歉我的英语不是我的母语。