怎样在c++里实现进程同步?

omrhal 2002-11-13 03:55:09
本人要写5哲学家就餐问题,用到5个函数进程p1(),P2(),P3(),
P4(),P5();需要同步执行,请问该怎么做?
...全文
396 7 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
7 条回复
切换为时间正序
请发表友善的回复…
发表回复
ljf1107 2002-11-21
  • 打赏
  • 举报
回复
ok
eion 2002-11-21
  • 打赏
  • 举报
回复
我来了,别耍赖,我个人要 50 分!

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

#define N 4 /* 哲学家的个数 */
#define P(S) WaitForSingleObject(S, INFINITE) // 定义Windows下的P操作
#define V(S) ReleaseSemaphore(S, 1, NULL) // 定义Windows下的V操作

typedef HANDLE Semaphore; // 信号量的Windows原型
HANDLE hThread[N]; // 线程计数
Semaphore S[N]; // N根筷子, N个信号量


// 对每个哲学家的线程
DWORD WINAPI Philosopher(LPVOID para)
{
// i表示第i个哲学家
int i = *(int *)para, j;
int period = 10 * (i+1);

// j只是用来打印缩进用
char s[10] = "";
for (j=0; j<i; j++) strcat(s, "\t\t");

while ( 1 )
{
printf("%s%03d: think...\n", s, i);
Sleep(1*period);

printf("%s%03d: Hungry\n", s, i);

Sleep(2*period);
printf("%s%03d: Get %d ...\n", s, i, i);
P(S[i]);
printf("%s%03d: Got %d OK\n", s, i, i);

Sleep(period);

printf("%s%03d: Get %d ...\n", s, i, (i+1)%N);
P(S[(i+1)%N]);
printf("%s%03d: Got %d OK\n", s, i, (i+1)%N);

printf("%s%03d: Eating ...\n", s, i);
Sleep(2*period);
printf("%s%03d: Eaten.\n", s, i);

printf("%s%03d: Put down %d\n", s, i, i);
V(S[i]);

printf("%s%03d: Put down %d\n", s, i, (i+1)%N);
V(S[(i+1)%N]);

printf("\n");
}
return 0;
}
int main(int argc, char *argv[])
{
DWORD tid;
int i=0;
char sTmp[32];

// 初始化信号量
for (i=0; i<N; i++)
{
wsprintf(sTmp, "chopsticks=%d", i);
S[i] = CreateSemaphore(NULL, 1, 1, sTmp);
if ( !S[i] )
{
printf("Create S Error!\n");
return -1;
}
}

// 开启5个哲学家线程
for (i=0; i<N; i++)
{
hThread[i] = CreateThread(NULL, 0, Philosopher, &i, 0, &tid);
if ( hThread[i] ) WaitForSingleObject(hThread[i], 100);
}

// 等待哲学家执行
WaitForMultipleObjects(N, hThread, TRUE, INFINITE);
return 0;
}
hello_wyq 2002-11-14
  • 打赏
  • 举报
回复
互斥不就可以了吗?

xspf 2002-11-14
  • 打赏
  • 举报
回复
是不是哲学家两只手就餐问题,要求同时锁住两个“资源”,避免死锁?

如果是这个问题,可以用mutex配合WaitForMultipleObjects一同时锁住两个资源,用CreateMutex()可以建立一个mutex。
omrhal 2002-11-14
  • 打赏
  • 举报
回复
如果是在win98或2000里该怎么搞呢?是不是用c++不行?
terron 2002-11-13
  • 打赏
  • 举报
回复
进程?线程?
codingcoding 2002-11-13
  • 打赏
  • 举报
回复
这个要有具体的操作系统来参与了。

70,022

社区成员

发帖
与我相关
我的任务
社区描述
C语言相关问题讨论
社区管理员
  • C语言
  • 花神庙码农
  • 架构师李肯
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧