我正在编写一个多线程网络程序。我需要声明一个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.
}
编辑:更多信息,因为似乎没有人遇到我的问题。我没有时间和信号量的问题。线程之间共享数据也不存在问题。线程创建也没有问题。
我的问题是我不知道如何将共享缓冲区声明为数组类型,以便稍后可以由一个线程初始化,这样两个线程都可以使用它。我也不知道如何进行初始化。
答案 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,那么你也应该将它存储在一个文件范围的变量中。