不知道长度的2D全局数组。最佳实践?

时间:2015-04-05 16:21:19

标签: c arrays multithreading linked-list buffer

我需要有缓冲区,我将在多种不同类型的线程中使用它。所以数组需要是全局的。

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

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

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

感谢任何帮助!

1 个答案:

答案 0 :(得分: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. 简单的打印缓冲区内容。
  7. 好的,这是代码。

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

    随意问你是否理解某事,也对我的英语不好,这不是我的母语。