2015-04-05 35 views
0

我需要有缓冲区,我将在多种不同类型的线程中使用它。所以这个数组需要是全局的。不知道长度的2D全局数组。最佳实践?

缓冲区大小和缓冲区数量作为程序的输入。

作为替代方案,我可以实现链接列表。

实现此类缓冲区的最佳方式是什么?你能提供样品吗?

任何帮助表示赞赏!

回答

0

我不明白“不知道长度”是什么意思,如果你传递每个缓冲区的大小和缓冲区的数量作为输入参数,那么你知道每个需要的长度。

也许这不是最好的,但这将是我的方式。

首先声明全局缓冲区和线程。

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; 
} 
  1. 转换程序参数传递给整数。
  2. 这里我们给缓冲区分配未知类型的数组。
  3. 在这里我们分配每个缓冲区与他的大小以字节为单位。
  4. 最后我们创建工作线程。重要的是他们 将同时运行。
  5. 等待所有线程完成他们的工作。
  6. 简单的打印缓冲区内容。

好的,这里是代码。

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; 
} 

随意问,如果你不明白的东西,也抱歉我的英语,它不是我的母语。