执行后初始化一个char数组,因为size最初是未知的

时间:2016-03-16 16:18:00

标签: c arrays multithreading

我正在编写一个多线程网络程序。我需要声明一个char数组,以便两个线程都可以看到它。唯一的问题是,我不知道阵列最初会有多大,因为我必须等待网络上的另一台计算机告诉我。我发现时已经创建了线程。 sharedBuffer完全正确的大小至关重要。

下面的伪代码:

int bufSize;
char sharedBuffer[1]; //Ideally, sharedBuffer[bufSize]
                   //bufSize is not known yet, though.
                   //I don't know the best thing to declare here

int main(int argc, char* argv[]){
    pthread_t ThreadA;
    pthread_t ThreadB;
    pthread_create(&ThreadA,0,&funcA,0);
    pthread_create(&ThreadB,0,&funcB,0);
}

void *funcA(){
    bufSize = getSize();//getSize implementation irrelevant, but working
                        //Small numbers expected. Probably no higher than 1024
    //Initialize sharedBuffer here
    sharedBuffer = realloc(sharedBuffer,bufSize*sizeof(char));
    //Instinct tells me "sharedBuffer = new char[bufSize];"
    //    but I know C wont let me do that

    //semaphore post
}

void *funcB(){
    //semaphore wait (blocks until threadA posts)

    printf("Size of shared buffer: %d\n",sizeof(sharedBuffer));
    //needs to output bufSize
    //actual value is irrelevant. Data just needs to be shared correctly.
}

编辑:更多信息,因为似乎没有人遇到我的问题。我没有时间和信号量的问题。线程之间共享数据也不存在问题。线程创建也没有问题。

我的问题是我不知道如何将共享缓冲区声明为数组类型,以便稍后可以由一个线程初始化,这样两个线程都可以使用它。我也不知道如何进行初始化。

4 个答案:

答案 0 :(得分:2)

只是做

char *sharedBuffer=NULL;

printf("Size of shared buffer: %d\n",bufSize);

你的问题是线程分配它。你需要推迟threadB直到threadA设置缓冲区。或做一些信号/锁定

答案 1 :(得分:0)

char* sharedBuffer = (char *) malloc(bufSize);

稍后使用free(sharedBuffer);在完成内存后释放内存

答案 2 :(得分:-1)

你不能realloc首先没有用malloc分配的东西!您需要做的是在第一个帖子中将缓冲区设为char*,而不是malloc()

在第二个线程中,您应该使用第一个线程设置的大小。

您的代码中还有第三个可能的问题。根据您使用的信号量类型,它们可能不适合多线程环境。使用semctl()获得的是在这种情况下要避免的。你使用sem_init获得的是正常的。

答案 3 :(得分:-2)

首先,当您的第二个线程正在等待第一个线程获取缓冲区大小时,您可以在启动线程之前调用getSize()。之后你可以: 1.动态分配文件范围内的缓冲区,并让线程指向它。 2.为每个线程提供缓冲区大小,让它们分配自己的缓冲区,从而隔离内存并消除使用锁保护内存的需要。

如果你选择第一个选项,pthread库中就有可以在文件范围内静态分配的互斥锁,或者在每个线程中发送指向它的指针以处理同步。

另一个问题是您无法重新分配静态分配的内存,因此您将其更改为char *,而不是使用malloc返回的指针重新分配。 如果线程B需要知道数组的大小,并且你选择了1,那么你也应该将它存储在一个文件范围的变量中。