【发布时间】:2011-02-21 01:53:30
【问题描述】:
我来自 C# 背景,在 C 语言的并发方面遇到了一些困难。我不会对你撒谎……这是我必须为学校做的项目的一部分。尽管我在专业上使用过高级语言,但我的高级论文教授强迫整个班级用 C 编写代码(我们大多数人几乎没有甚至没有经验... :( )。
不管怎样,回到问题上来。我有一个全局整数变量(从 0 开始),需要同时递增 5 个进程,直到达到 100(而不是 100%)。
基本上发生的事情是,每个子进程不是单独修改completionCounter,而是复制它......
是否有 lock(object) 或 C# 中可用的类似名称?我尝试使用二进制信号量,但我无法让它工作,我还没有玩过共享内存。
const int THREADCOUNT = 5;
int completionCounter = 0;
int main(int argc, char **argv)
{
int count = 0;
pid_t pid;
for(count = 0; count<THREADCOUNT; count++)
{
if( (pid = fork()) < 0 )
{
//error...
return -1;
}
else if( pid == 0 )
{
//child;
while(completionCounter != 100 )
{
printf("[%i] process downloading data chunk...", getpid());
//do stuff here
completionCounter += 5;
}
}
else
{
//parent.
}
}
}
【问题讨论】:
-
fork() 创建一个新进程,而不是线程——这就是他们创建值副本的原因。编辑:我要做的方式是创建一个“服务器”进程,有 5 个子“工作”进程,它们与管道通信 gnu.org/s/libc/manual/html_node/Creating-a-Pipe.html
-
@Rob 如果我要使用分叉,我将如何强制每个子进程修改全局值而不是复制它?
标签: c concurrency