这是我的代码:
#include <stdio.h>
#include <unistd.h>
static volatile int t=0;
int main(void){
int i;
for (i=0; i<2; i++){
fork();
printf("pid:%d: addr:%d val:%dn", getpid(), &t, t++);
}
printf("pid:%d: addr:%d val:%dn", getpid(), &t, t++);
return 0;
}
这样的输出:
pid:16232: addr:134518684 val:0
pid:16233: addr:134518684 val:0
pid:16232: addr:134518684 val:1
pid:16232: addr:134518684 val:2
pid:16234: addr:134518684 val:1
pid:16234: addr:134518684 val:2
pid:16233: addr:134518684 val:1
pid:16233: addr:134518684 val:2
pid:16235: addr:134518684 val:1
pid:16235: addr:134518684 val:2
全局变量t的地址是相同的,是否所有线程都操作相同的变量t?我希望val是"0,1,2,3,4,5,…",我该怎么办?
这是在分叉一个不同的进程,NOT生成新线程。结果是有意义的,因为分叉的进程将获得父进程内存的副本。
如果你打算使用叉子,这是一种更标准的方法:
int main ()
{
int pid;
pid = fork();
if (pid == 0) {
// This will be where the child process executes
} else if (pid > 0) {
// This is where the parent process executes
}
return 0;
}
结果是正确的。这是因为,在分叉时,您创建了一个新进程,该进程将获得父进程内存的副本。
你看到的地址是虚拟的,所以,即使它们是相同的,也不意味着它们指向相同的物理内存区域。
fork
不会产生您期望的结果。即使它确实产生了一个新线程,你也没有以线程安全的方式递增变量。如果你想生成线程并在每个线程中增加一个变量,你可以使用pthreads和互斥锁,比如:
#include <stdio.h>
#include <unistd.h>
#include <pthread.h>
int t = 0;
pthread_mutex_t mutex = PTHREAD_MUTEX_INITIALIZER;
void* threadFunc(void* param) {
pthread_mutex_lock(&mutex);
printf("%dn", t++);
pthread_mutex_unlock(&mutex);
}
int main(void){
int i;
pthread_t threads[5];
for (i = 0; i < 5; i++){
pthread_create(&threads[i], NULL, threadFunc, NULL);
}
for (i = 0; i < 5; i++){
pthread_join(threads[i], NULL);
}
pthrad_mutex_destroy(&mutex);
return 0;
}
所有线程共享父进程的地址空间(t
所在的位置),因此它们都将递增相同的t
。