哲学家就餐问题(C语言实现)C原代码是什么

用C语言实现哲学家进餐的问题_百度文库
您的浏览器Javascript被禁用,需开启后体验完整功能,
享专业文档下载特权
&赠共享文档下载特权
&100W篇文档免费专享
&每天抽奖多种福利
两大类热门资源免费畅读
续费一年阅读会员,立省24元!
用C语言实现哲学家进餐的问题
阅读已结束,下载本文需要
定制HR最喜欢的简历
下载文档到电脑,同时保存到云知识,更方便管理
加入VIP
还剩2页未读,
定制HR最喜欢的简历
你可能喜欢&>&Linux C 哲学家就餐问题
Linux C 哲学家就餐问题
上传大小:4KB
使用Linux C 在Visual C++ 下实现的关于哲学家就餐问题
综合评分:4
{%username%}回复{%com_username%}{%time%}\
/*点击出现回复框*/
$(".respond_btn").on("click", function (e) {
$(this).parents(".rightLi").children(".respond_box").show();
e.stopPropagation();
$(".cancel_res").on("click", function (e) {
$(this).parents(".res_b").siblings(".res_area").val("");
$(this).parents(".respond_box").hide();
e.stopPropagation();
/*删除评论*/
$(".del_comment_c").on("click", function (e) {
var id = $(e.target).attr("id");
$.getJSON('/index.php/comment/do_invalid/' + id,
function (data) {
if (data.succ == 1) {
$(e.target).parents(".conLi").remove();
alert(data.msg);
$(".res_btn").click(function (e) {
var parentWrap = $(this).parents(".respond_box"),
q = parentWrap.find(".form1").serializeArray(),
resStr = $.trim(parentWrap.find(".res_area_r").val());
console.log(q);
//var res_area_r = $.trim($(".res_area_r").val());
if (resStr == '') {
$(".res_text").css({color: "red"});
$.post("/index.php/comment/do_comment_reply/", q,
function (data) {
if (data.succ == 1) {
var $target,
evt = e || window.
$target = $(evt.target || evt.srcElement);
var $dd = $target.parents('dd');
var $wrapReply = $dd.find('.respond_box');
console.log($wrapReply);
//var mess = $(".res_area_r").val();
var mess = resS
var str = str.replace(/{%header%}/g, data.header)
.replace(/{%href%}/g, 'http://' + window.location.host + '/user/' + data.username)
.replace(/{%username%}/g, data.username)
.replace(/{%com_username%}/g, data.com_username)
.replace(/{%time%}/g, data.time)
.replace(/{%id%}/g, data.id)
.replace(/{%mess%}/g, mess);
$dd.after(str);
$(".respond_box").hide();
$(".res_area_r").val("");
$(".res_area").val("");
$wrapReply.hide();
alert(data.msg);
}, "json");
/*删除回复*/
$(".rightLi").on("click", '.del_comment_r', function (e) {
var id = $(e.target).attr("id");
$.getJSON('/index.php/comment/do_comment_del/' + id,
function (data) {
if (data.succ == 1) {
$(e.target).parent().parent().parent().parent().parent().remove();
$(e.target).parents('.res_list').remove()
alert(data.msg);
//填充回复
function KeyP(v) {
var parentWrap = $(v).parents(".respond_box");
parentWrap.find(".res_area_r").val($.trim(parentWrap.find(".res_area").val()));
评论共有13条
很不错,改一下就能用了
稍微改了一下 就能运行了 很不错 ~
代码比较规整,清晰,很适合初学者学习,谢谢分享!
VIP会员动态
热门资源标签
CSDN下载频道资源及相关规则调整公告V11.10
下载频道用户反馈专区
下载频道积分规则调整V1710.18
spring mvc+mybatis+mysql+maven+bootstrap 整合实现增删查改简单实例.zip
资源所需积分/C币
当前拥有积分
当前拥有C币
输入下载码
为了良好体验,不建议使用迅雷下载
Linux C 哲学家就餐问题
会员到期时间:
剩余下载个数:
剩余积分:0
为了良好体验,不建议使用迅雷下载
积分不足!
资源所需积分/C币
当前拥有积分
您可以选择
程序员的必选
绿色安全资源
资源所需积分/C币
当前拥有积分
当前拥有C币
为了良好体验,不建议使用迅雷下载
资源所需积分/C币
当前拥有积分
当前拥有C币
为了良好体验,不建议使用迅雷下载
资源所需积分/C币
当前拥有积分
当前拥有C币
您的积分不足,将扣除 10 C币
为了良好体验,不建议使用迅雷下载
无法举报自己的资源
你当前的下载分为234。
你还不是VIP会员
开通VIP会员权限,免积分下载
你下载资源过于频繁,请输入验证码
您因违反CSDN下载频道规则而被锁定帐户,如有疑问,请联络:!
若举报审核通过,可返还被扣除的积分
被举报人:
请选择类型
资源无法下载 ( 404页面、下载失败、资源本身问题)
资源无法使用 (文件损坏、内容缺失、题文不符)
侵犯版权资源 (侵犯公司或个人版权)
虚假资源 (恶意欺诈、刷分资源)
含色情、危害国家安全内容
含广告、木马病毒资源
*投诉人姓名:
*投诉人联系方式:
*版权证明:
*详细原因:
Linux C 哲学家就餐问题问题描述:有五位哲学家围绕着餐桌坐,每一位哲学家要么思考,要么吃饭。为了吃饭,哲学家必须拿起两双筷子(分别放于左右两端)不幸的是,筷子的数量和哲学家相等,所以每只筷子必须由两位哲学家共享。
该问题是一个典型的互斥问题,有的操作系统教科书上说哲学家还可以有第三中状态,即等待状态。我个人觉得哲学家不应该有等待状态,即一个哲学家拿着一根筷子,等待旁边的哲学家放下另一根筷子。 虽然哲学家一次只能拿一根筷子,也就是说哲学家拿两根筷子的动作是分开的,但是就问题的解题思路来说,我们必须让哲学家拿两根筷子的连续动作是一个互斥的单元,即要么同时拿到两根筷子,要么放弃继续思考,等待机会再拿。而不应该让他只拿着一根筷子等待另一根。 试想,如果允许哲学家拿着一根筷子在那里等待,那么在理论上就必定会出现所有的哲学家都拿着一根筷子等待另一根筷子的局面,这就成了死锁。
给予以上分析,我用C语言模拟实现了一种解决方案。该方案的原理是:首先设置一个全局互斥量,当一个哲学家决定要拿筷子时,首先他要锁定该互斥量,这样其他哲学家就不能获得该互斥量,也就不能拿筷子。如果此时正好另一个哲学家锁定了该互斥量去拿两根筷子,那么该哲学家就等待另那个哲学家拿完筷子释放全局互斥量。然后去拿测试两边的哲学家是否在进餐,如果都没有进餐,那么那就可以拿到两根筷子,然后释放互斥量,自己进入吃饭状态。如果旁边有一个哲学家在进餐,那么他就释放互斥量,继续思考。
以下是C语言的具体实现,这是我个人的一点思考,如有不对的地方,欢迎指正探讨。
#include&stdio.h&
#include&pthread.h&#include&unistd.h&#define N
5#define LEFT
(i-1+N)%N#define RIGHT
(i+1)%N#define THINKING
0#define EATING
1int state[N];pthread_mutex_t
mutex = PTHREAD_MUTEX_INITIALIZER;pthread_mutexattr_void philosopher(i){
take_forks(i);
put_forks(i);
}}void take_forks(int i){
pthread_mutex_lock(&mutex);
pthread_mutex_unlock(&mutex);}void put_forks(int i){
state[i] = THINKING;
}void test(int i){
if(state[LEFT] != EATING && state[RIGHT] != EATING)
state[i] = EATING;
return 0;}void eat(int i){
if(state[i] == EATING)
printf("philosopher %d is eating......./n", i);
}}void think(int i){
if(state[i] == THINKING)
printf("philosopher %d is thinking......./n", i);
}}int main(){
int i = 0;
for(i = 0; i & N ; i++)
ret=pthread_create(&id,NULL,(void *) philosopher, i);
if(ret!=0)
printf ("Create pthread error!/n");
pthread_join(id,NULL);}
哲学家就餐问题(C语言实现)
哲学家进餐问题的c语言代码
完整的哲学家进食代码
哲学家就餐问题——多线程代码学习
哲学家进餐问题C语言实现
经典同步问题(二)---哲学家就餐问题
没有更多推荐了,&>&C语言解决哲学家就餐问题
C语言解决哲学家就餐问题
上传大小:2KB
C语言解决哲学家就餐问题
综合评分:0
{%username%}回复{%com_username%}{%time%}\
/*点击出现回复框*/
$(".respond_btn").on("click", function (e) {
$(this).parents(".rightLi").children(".respond_box").show();
e.stopPropagation();
$(".cancel_res").on("click", function (e) {
$(this).parents(".res_b").siblings(".res_area").val("");
$(this).parents(".respond_box").hide();
e.stopPropagation();
/*删除评论*/
$(".del_comment_c").on("click", function (e) {
var id = $(e.target).attr("id");
$.getJSON('/index.php/comment/do_invalid/' + id,
function (data) {
if (data.succ == 1) {
$(e.target).parents(".conLi").remove();
alert(data.msg);
$(".res_btn").click(function (e) {
var parentWrap = $(this).parents(".respond_box"),
q = parentWrap.find(".form1").serializeArray(),
resStr = $.trim(parentWrap.find(".res_area_r").val());
console.log(q);
//var res_area_r = $.trim($(".res_area_r").val());
if (resStr == '') {
$(".res_text").css({color: "red"});
$.post("/index.php/comment/do_comment_reply/", q,
function (data) {
if (data.succ == 1) {
var $target,
evt = e || window.
$target = $(evt.target || evt.srcElement);
var $dd = $target.parents('dd');
var $wrapReply = $dd.find('.respond_box');
console.log($wrapReply);
//var mess = $(".res_area_r").val();
var mess = resS
var str = str.replace(/{%header%}/g, data.header)
.replace(/{%href%}/g, 'http://' + window.location.host + '/user/' + data.username)
.replace(/{%username%}/g, data.username)
.replace(/{%com_username%}/g, data.com_username)
.replace(/{%time%}/g, data.time)
.replace(/{%id%}/g, data.id)
.replace(/{%mess%}/g, mess);
$dd.after(str);
$(".respond_box").hide();
$(".res_area_r").val("");
$(".res_area").val("");
$wrapReply.hide();
alert(data.msg);
}, "json");
/*删除回复*/
$(".rightLi").on("click", '.del_comment_r', function (e) {
var id = $(e.target).attr("id");
$.getJSON('/index.php/comment/do_comment_del/' + id,
function (data) {
if (data.succ == 1) {
$(e.target).parent().parent().parent().parent().parent().remove();
$(e.target).parents('.res_list').remove()
alert(data.msg);
//填充回复
function KeyP(v) {
var parentWrap = $(v).parents(".respond_box");
parentWrap.find(".res_area_r").val($.trim(parentWrap.find(".res_area").val()));
评论共有0条
VIP会员动态
CSDN下载频道资源及相关规则调整公告V11.10
下载频道用户反馈专区
下载频道积分规则调整V1710.18
spring mvc+mybatis+mysql+maven+bootstrap 整合实现增删查改简单实例.zip
资源所需积分/C币
当前拥有积分
当前拥有C币
输入下载码
为了良好体验,不建议使用迅雷下载
C语言解决哲学家就餐问题
会员到期时间:
剩余下载个数:
剩余积分:0
为了良好体验,不建议使用迅雷下载
积分不足!
资源所需积分/C币
当前拥有积分
您可以选择
程序员的必选
绿色安全资源
资源所需积分/C币
当前拥有积分
当前拥有C币
为了良好体验,不建议使用迅雷下载
资源所需积分/C币
当前拥有积分
当前拥有C币
为了良好体验,不建议使用迅雷下载
资源所需积分/C币
当前拥有积分
当前拥有C币
您的积分不足,将扣除 10 C币
为了良好体验,不建议使用迅雷下载
无法举报自己的资源
你当前的下载分为234。
你还不是VIP会员
开通VIP会员权限,免积分下载
你下载资源过于频繁,请输入验证码
您因违反CSDN下载频道规则而被锁定帐户,如有疑问,请联络:!
若举报审核通过,可返还被扣除的积分
被举报人:
请选择类型
资源无法下载 ( 404页面、下载失败、资源本身问题)
资源无法使用 (文件损坏、内容缺失、题文不符)
侵犯版权资源 (侵犯公司或个人版权)
虚假资源 (恶意欺诈、刷分资源)
含色情、危害国家安全内容
含广告、木马病毒资源
*投诉人姓名:
*投诉人联系方式:
*版权证明:
*详细原因:
C语言解决哲学家就餐问题新手园地& & & 硬件问题Linux系统管理Linux网络问题Linux环境编程Linux桌面系统国产LinuxBSD& & & BSD文档中心AIX& & & 新手入门& & & AIX文档中心& & & 资源下载& & & Power高级应用& & & IBM存储AS400Solaris& & & Solaris文档中心HP-UX& & & HP文档中心SCO UNIX& & & SCO文档中心互操作专区IRIXTru64 UNIXMac OS X门户网站运维集群和高可用服务器应用监控和防护虚拟化技术架构设计行业应用和管理服务器及硬件技术& & & 服务器资源下载云计算& & & 云计算文档中心& & & 云计算业界& & & 云计算资源下载存储备份& & & 存储文档中心& & & 存储业界& & & 存储资源下载& & & Symantec技术交流区安全技术网络技术& & & 网络技术文档中心C/C++& & & GUI编程& & & Functional编程内核源码& & & 内核问题移动开发& & & 移动开发技术资料ShellPerlJava& & & Java文档中心PHP& & & php文档中心Python& & & Python文档中心RubyCPU与编译器嵌入式开发驱动开发Web开发VoIP开发技术MySQL& & & MySQL文档中心SybaseOraclePostgreSQLDB2Informix数据仓库与数据挖掘NoSQL技术IT业界新闻与评论IT职业生涯& & & 猎头招聘IT图书与评论& & & CU技术图书大系& & & Linux书友会二手交易下载共享Linux文档专区IT培训与认证& & & 培训交流& & & 认证培训清茶斋投资理财运动地带快乐数码摄影& & & 摄影器材& & & 摄影比赛专区IT爱车族旅游天下站务交流版主会议室博客SNS站务交流区CU活动专区& & & Power活动专区& & & 拍卖交流区频道交流区
白手起家, 积分 81, 距离下一级还需 119 积分
论坛徽章:0
本帖最后由 shy永久 于
09:12 编辑
希望各位大神们能给我一份&&c语言&&格式的哲学家就餐问题的代码,注:不是c++代码,我想分析学习一下这个代码,在此拜谢了,
富甲一方, 积分 40576, 距离下一级还需 9424 积分
论坛徽章:210
貌似没有程序代码吧,都是伪代码
白手起家, 积分 81, 距离下一级还需 119 积分
论坛徽章:0
& & 不会吧,真的吗?那您给个伪代码让我先看看吧,我其实想要源代码注释一下,学习线程的,呵呵
富甲一方, 积分 40576, 距离下一级还需 9424 积分
论坛徽章:210
你在学程序设计,还是在学操作系统?稍微有点品味的OS教科书都有相关伪代码的,
哲学家就餐本身并不是一个程序,而是为了引入一类话题,在OS称为进程同步/异步,
学习进程,例子多球了,网上随便找找都是
白手起家, 积分 81, 距离下一级还需 119 积分
论坛徽章:0
& & 我先学了linux操作系统,现在也涉及到程序设计,现在老师让我找到哲学家进餐、还有读者写者问题的相关代码,自己注释一下,进一步的理解线程的作用和实现,我发现一些代码都是c++的,不是c语言,所以想麻烦您,帮帮忙
富甲一方, 积分 40576, 距离下一级还需 9424 积分
论坛徽章:210
大三,还是大四??你都有老师了,还是想办法跟老师保持节奏吧。
看看别的同学是怎么做的,商量一下,——这样有助于培养团队意识
听我的,不会害你
白手起家, 积分 81, 距离下一级还需 119 积分
论坛徽章:0
& & 嗯嗯,好吧,不过我还是的分析代码,那是任务啊,呵呵
稍有积蓄, 积分 330, 距离下一级还需 170 积分
论坛徽章:1
我这倒是有份,不知合不合要求……
(683 Bytes, 下载次数: 390)
14:57 上传
点击文件名下载附件
#include &pthread.h&
#include &stdio.h&
#define N 5
#define LEFT (i+N-1)%N
#define RIGHT (i+1)%N
#define THINK_TIME 3
#define EAT_TIME 2
enum { THINKING, HUNGRY, EATING } state[N];
pthread_mutex_t mutex = PTHREAD_MUTEX_INITIALIZER, s[N];
void test(int i)
{
& & if (state[i] == HUNGRY
& &&&&& state[LEFT] != EATING
& &&&&& state[RIGHT] != EATING)
& & {
& && &&&state[i] = EATING;
& && &&&pthread_mutex_unlock(&s[i]);
& & }
}
void take_forks(int i)
{
& & pthread_mutex_lock(&mutex);
& & state[i] = HUNGRY;
& & test(i);
& & pthread_mutex_unlock(&mutex);
& & pthread_mutex_lock(&s[i]);
}
void put_forks(int i)
{
& & pthread_mutex_lock(&mutex);
& & state[i] = THINKING;
& & test(LEFT);
& & test(RIGHT);
& & pthread_mutex_unlock(&mutex);
}
void think(int i)
{
& & printf(&philosopher %d is thinking...\n&, i);
& & sleep(THINK_TIME);
}
void eat(int i)
{
& & printf(&philosopher %d is eating...\n&, i);
& & sleep(EAT_TIME);
}
void* phi(void* vargp)
{
& & int i = *(int*)
& & while (1)
& & {
& && &&&think(i);
& && &&&take_forks(i);
& && &&&eat(i);
& && &&&put_forks(i);
& & }
& & return NULL;
}
int main()
{
& &
& & pthread_t tid[N];
& & for (i = 0; i & N; i++)
& && &&&pthread_create(&tid[i], NULL, phi, (void*)(&i));
& & for (i = 0; i & N; i++)
& && &&&pthread_join(tid[i], NULL);
& & return 0;
}
复制代码
白手起家, 积分 81, 距离下一级还需 119 积分
论坛徽章:0
silverzhaojr
& & 真的很感谢,我回去好好看看,不管怎样真的谢谢,我会去注释运行一下,谢谢啦
白手起家, 积分 48, 距离下一级还需 152 积分
论坛徽章:0
恩恩,学习了
北京盛拓优讯信息技术有限公司. 版权所有 京ICP备号 北京市公安局海淀分局网监中心备案编号:22
广播电视节目制作经营许可证(京) 字第1234号
中国互联网协会会员&&联系我们:
感谢所有关心和支持过ChinaUnix的朋友们
转载本站内容请注明原作者名及出处

我要回帖

更多关于 哲学家就餐问题的分析与解决方案 的文章

 

随机推荐