如何使用进程而不是线程重写此代码?如何在此文件中用进程替换线程而不手动启动其他文件?代码不完整,但这里不需要头文件。
#include <pthread.h>
#include <semaphore.h>
sem_t p1_p2;
sem_t p2_p3p5;
sem_t p3_p4;
sem_t p4p5_p6;
void* P1(void *args)
{
OS_WORK();
OS_SEM_UP(p1_p2);
}
void* P2(void *args)
{
OS_SEM_DOWN(p1_p2);
OS_WORK();
OS_SEM_UP(p2_p3p5);
OS_SEM_UP(p2_p3p5);
}
void* P3(void *args)
{
OS_SEM_DOWN(p2_p3p5);
OS_CS_WORK();
OS_SEM_UP(p3_p4);
}
void* P4(void *args)
{
OS_SEM_DOWN(p3_p4);
OS_CS_WORK();
OS_SEM_UP(p4p5_p6);
}
void* P5(void *args)
{
OS_SEM_DOWN(p2_p3p5);
OS_CS_WORK();
OS_SEM_UP(p4p5_p6);
}
void* P6(void *args)
{
OS_SEM_DOWN(p4p5_p6);
OS_SEM_DOWN(p4p5_p6);
OS_WORK();
}
int main (int argc, char * argv[])
{
pthread_t p1, p2, p3, p4, p5, p6;
os_base_init(TRUE, TRUE);
OS_SEM_INIT(p1_p2, 0);
OS_SEM_INIT(p2_p3p5, 0);
OS_SEM_INIT(p3_p4, 0);
OS_SEM_INIT(p4p5_p6, 0);
pthread_create(&p6, NULL, P6, NULL);
pthread_create(&p5, NULL, P5, NULL);
pthread_create(&p4, NULL, P4, NULL);
pthread_create(&p3, NULL, P3, NULL);
pthread_create(&p2, NULL, P2, NULL);
pthread_create(&p1, NULL, P1, NULL);
pthread_join(p1, NULL);
pthread_join(p2, NULL);
pthread_join(p3, NULL);
pthread_join(p4, NULL);
pthread_join(p5, NULL);
pthread_join(p6, NULL);
OS_SEM_DESTROY(p1_p2);
OS_SEM_DESTROY(p2_p3p5);
OS_SEM_DESTROY(p3_p4);
OS_SEM_DESTROY(p4p5_p6);
os_base_destroy();
return 0;
}
如何使用进程而不是线程重写此代码?如何在此文件中用进程替换线程而不手动启动其他文件?代码不完整,但这里不需要头文件。
1条答案
按热度按时间3phpmpom1#
如何使用进程而不是线程重写这段代码?
ShadowRanger说:“多处理器设计的便携性较差,而且通常比较昂贵。”
线程之间的区别在于它们都运行在同一个虚拟地址空间中。让多个线程访问同一个全局变量或同一个堆对象非常容易。创建进程之间共享的内存区域以及在这些共享区域中创建数据结构的方法则要花费大量的工作。
另外,你的程序需要使用各种inter-process communication(IPC)方法来同步访问共享内存。许多多进程应用程序完全放弃共享内存,而完全依赖IPC来实现不同进程之间的通信。但是,重新构造一个以前使用共享内存的程序,转而使用IPC,这可能是一项巨大的任务。
最重要的是,为了使用IPC,或者创建共享内存区域,你需要调用的库在不同的操作系统上是不同的。所以,如果你需要你的程序能够跨平台移植,那就增加了整个复杂性。
OS_WORK()
,...OS_CS_WORK()
对于你的问题没有一般性的答案。如何移植你的程序的答案很大程度上取决于这些函数做什么,以及它们如何相互通信。