我正在嘗試編寫一個允許三個線程訪問/修改公共緩衝區的程序。我在全局聲明緩衝區,並在main()函數的開頭調用malloc。然後我通過fork()創建不同的線程。信號量用於確保一次只能訪問/更新緩衝區。我感到困惑的是,其他線程對緩衝區的更改沒有被單一線程所取代。我在每個線程中打印出緩衝區內存的位置,其中所有的線程都是一樣的。不會更新它貫穿所有線程?我在印象線程共享相同的資源/地址空間?線程訪問/更新共享內存位置
#define buf_size 100
char *buffer;
int main(int argc, char *argv[])
{
sem_t sp;
(sem_init(&sp,1,1));
buffer= malloc(100);
pid_t p2_pid; // child PID
if ((p2_pid = fork()) < 0)
{
err_sys("fork error (1)");
}
else if (p2_pid > 0) // this is the parent (P1)
{
int i = 0;
sem_wait(&sp);
printf("Process 1 accessing buffer\n");
printf("BufAddr: %d\n", (buffer));
for(i=0; i < 50; i++)
{
if(i%2==0)
{
buffer[i] = 'c';
}
else
{
buffer[i] = 'j';
}
printf("%c",(buffer[i]));
}
printf("\n");
sem_post(&sp);
if (waitpid(p2_pid, NULL, 0) < 0) // wait for child (P2)
{ err_sys("waitpid error (1)"); }
}
else // this is the child (P2)
{
pid_t p3_pid;
if ((p3_pid = fork()) < 0)
{
err_sys("fork error (2)");
}
else if (p3_pid > 0)
{
int j = 0;
sem_wait(&sp);
printf("Process 2 accessing buffer\n");
printf("BufAddr: %d\n", (buffer));
for(j=0; j < 50; j++)
{
if(buffer[j]=='c')
{
buffer[j] = 'b';
}
else
{
buffer[j] = 'g';
}
printf("%c",(buffer[j]));
}
printf("\n");
sem_post(&sp);
if (waitpid(p3_pid, NULL, 0) < 0)
{ err_sys("waitpid error (2)"); }
}
else
{
int k = 0;
int bCount = 0;
int gCount = 0;
sem_wait(&sp);
printf("Process 3 accessing buffer\n");
printf("BufAddr: %d\n", (buffer));
for(k=0; k < 50; k++)
{
if(buffer[k]=='g')
{
gCount++;
}
else
{
bCount++;
}
printf("%c",(buffer[k]));
}
sem_post(&sp);
printf("bCount = %d\n" , (bCount));
printf("gCount = %d\n" , (gCount));
}
}
return 0;
}
你能顯示一些相關的代碼嗎? –
你是否期待我們來你家看代碼? –
很抱歉現在添加它 – Danzo