如何使进程中的所有其他线程都可以看到线程操作的结果?

时间:2013-11-15 10:57:14

标签: c multithreading fork

以下是我曾经意识到这种情况没有发生的示例代码。我的目标是让父母看到孩子在myint中对struct ss所做的更改(在这个特定的例子中,我希望父母打印PARENT myint = 1,或者孩子的任何价值集)。

#include <stdio.h>
#include <unistd.h>
#include <stdlib.h>

struct ss {
  int myint;
};

int main(void) {
  int pid;
  struct ss *s = (struct ss *)malloc(sizeof(struct ss));
  s->myint = 0;
  if ((pid = fork()) < 0) return 1;
  switch (pid) {
    case -1: return 1;
    case 0:
      printf("CHILD address = %p\n", s);
      s->myint = 1;
      printf("CHILD myint = %d\n", s);
      printf("CHILD done.\n");
      // free(s);
      return 0;
    default:
      printf("PARENT address = %p\n", s);
      waitpid(pid, NULL, 0);
      printf("PARENT myint = %d\n", s->myint);
      printf("PARENT done.\n");
      break;
  }
  free(s);
  return 0;
}

这是我得到的一个输出:

PARENT address = 0x1a79010
CHILD address = 0x1a79010
CHILD myint = 1
CHILD done.
PARENT myint = 0
PARENT done.
TBH,这让我完全感到困惑:PARENT和CHILD如何具有相同的地址,但很明显,由于某些原因,父母没有看到孩子写给这个地址的价值?此外,我认为除了调用堆栈之外的所有内存都在进程的线程之间共享。我在这里忽略了一些微不足道的错误吗?

3 个答案:

答案 0 :(得分:3)

fork()没有启动新线程,它会克隆整个过程。所以在fork()之后你有两个具有相同内存的进程,所以变量地址是相同的。

答案 1 :(得分:0)

威利斯说。如果您想实现目标,可能需要使用POSIX pthread来创建线程。

答案 2 :(得分:0)

我在另一个主题中回答了这个问题,这是我的回答: 你正在使用fork()。它创建的进程是实际进程的完全副本,但它不共享相同的内存。如果使用线程,所有内存寻址都将被共享,您需要同步访问共享内存位置以满足数据的一致性。