至于线程,我有互斥和条件,所以我可以很容易地操纵它们
但是,如果我按fork()
创建两个流程,我怎么能让它们交替?
或者,有没有办法为流程创建“关键部分”?
我打算制作一个打印“r”和“w”的程序,这里是代码。
#include <stdio.h>
#include <stdlib.h>
int pipe_1[2];
int flag = 0;
void r();
void w();
int main() {
pipe(pipe_1);
if(fork())
r();
else
w();
}
void r() {
int count = 0;
while(1) {
printf("%d \n", flag);
if (count == 10)
exit(0);
if(flag == 0) {
puts("r");
flag = 1;
count++;
while(flag == 1)
;
}
}
}
void w() {
while(1) {
if(flag == 1) {
puts("w");
flag = 0;
while(flag == 0)
;
}
}
}
输出只是:
0
r
然后它似乎进入一个无限循环
有什么问题?
什么是交替流程的正确方法?
感谢。
答案 0 :(得分:1)
它们是独立的进程,因此每个进程都有自己的标志;改变它不会影响w。
答案 1 :(得分:1)
这可能是压倒性的,但你可以使用大量的原语。在此处查看列表。
http://beej.us/guide/bgipc/output/html/singlepage/bgipc.html
看一下清单,几乎所有这些都可以使用。有些更像传统的pthread同步原语,有些更高级,但仍可用于同步。
例如,你可以在两者之间打开一个TCP套接字,并在另一边转发时发送消息。也许有一个递增的数字。
或许更传统的东西就是信号量:
http://beej.us/guide/bgipc/output/html/singlepage/bgipc.html#semaphores
此外,这假设是一个类似现代unix的平台。 Windows可能非常不同。
看起来你已经有了一个管道,所以你可以使用它来让每一方在完成打印后向另一方发送消息。另一方会进行阻塞读取,然后在发送消息时返回,执行打印,发回消息,然后返回阻止读取。
答案 2 :(得分:1)
为了使两个进程相互通信而不共享相同的地址空间(如线程一样),它们必须使用进程间通信手段(又称IPC)。一些IPC机制是:共享内存,信号量,管道,套接字,消息队列等。大多数情况下,IPC机制是特定于操作系统的。但是,很多想法都足够通用,因此可以提出一个可移植的实现,Boost项目将其作为Boost.Interprocess库的一部分。我认为你首先应该看看Synchronization Mechanisms部分。但请注意,这是一个C ++库。我不知道任何C库和Boost一样好。
希望它有所帮助。祝你好运!