【问题标题】:Initialize a char array after execution because size is initially unknown执行后初始化一个 char 数组,因为大小最初是未知的
【发布时间】:2016-03-16 16:17:59
【问题描述】:

我正在编写一个多线程网络程序。我需要声明一个 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.
}

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

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

【问题讨论】:

  • 数组不是指针(反之亦然)!
  • sizeof() 产生一个未签名的size_t。一般来说,在不需要的情况下混合有符号 (int) 和无符号整数是一个坏主意。您应该在整个代码中使用size_t
  • 您可以永远在多线程应用程序中使用信号量,在线程之间共享公共内存。
  • @SergeyA:我猜sem_init 的联机帮助页是无用的:If pshared has the value 0, then the semaphore is shared between the threads of a process, and should be located at some address that is visible to all threads (e.g., a global variable, or a variable allocated dynamically on the heap).,因为你对“永远不会”如此确定。
  • @EOF,我说的是不同的信号量例程 - 由semctl 和朋友控制的信号量例程。

标签: c arrays multithreading


【解决方案1】:

只是做

char *sharedBuffer=NULL;

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

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

【讨论】:

  • 分配它的线程不是问题,而是目标。 ThreadB 被推迟,直到 ThreadA 设置缓冲区。问题是我不知道如何让 ThreadA 做到这一点。您的 printf 语句与我要解决的问题无关。 bufSize 在线程之间正确共享。缓冲区本身不是。
  • 我向你展示了如何做到这一点,使用指针而不是数组,休息很好,realloc 会为你做分配
  • realloc 没有完成工作。 threadB 仍然将其视为 8 个字节,无论我将其重新分配到什么大小。
  • 看看我的第二行代码。 sizeof(sharedbuffer) 是一个常量值(指针的大小)。你必须使用 bufsize
【解决方案2】:
char* sharedBuffer = (char *) malloc(bufSize);

以后用free(sharedBuffer);完成后释放内存

【讨论】:

    【解决方案3】:

    你不能先realloc 没有分配给malloc 的东西!你需要做的是让你的缓冲区成为char*,而不是malloc() 在第一个线程中。

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

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

    【讨论】:

    • 你完全可以realloc()calloc()realloc()分配的东西。
    • “您的代码中还有第三个大问题。信号量不能用于使用公共内存的多线程应用程序!” - 嗯?请详细说明您的意思!
    • @Olaf,SystemV 信号量(semctl 和朋友)不适合这个。我想,我很快就认为 OP 正在使用这些。
    • ThreadB 实际上并不关心大小。它只需要能够看到 ThreadA 创建的数组即可。
    • @GregTheTraceur,您希望对未知大小的数组做什么?
    【解决方案4】:

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

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

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

    【讨论】:

    • sharedBuffer 是一个静态数组。你不能realloc一个静态变量!
    猜你喜欢
    • 2014-04-21
    • 1970-01-01
    • 1970-01-01
    • 2020-10-11
    • 1970-01-01
    • 1970-01-01
    • 2012-08-03
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多