当前位置: 首页 > 知识库问答 >
问题:

为什么这个互斥体代码不能按预期工作?

唐哲
2023-03-14
pthread_mutex_t lock;

在主线程中初始化:

pthread_mutex_lock(&lock)

然后在奴隶身上,当它等待主人的时候,我会这样做:

奴隶必须在这里等待:

pthread_mutex_lock(&lock);
pthread_mutex_unlock(&lock);
pthread_mutex_unlock(&lock);
pthread_mutex_lock(&lock);

奴隶:

printf("slave thread starting lock sequence\n");fflush(stdout);
pthread_mutex_lock(&lock);
printf("slave thread intra lock sequence\n");fflush(stdout);
pthread_mutex_unlock(&lock);
printf("slave thread completed lock sequence\n");fflush(stdout);

主人:

printf("master thread starting lock sequence\n");fflush(stdout);
pthread_mutex_unlock(&lock);
printf("master thread intra lock sequence\n");fflush(stdout);
pthread_mutex_lock(&lock);
printf("master thread completed lock sequence\n");fflush(stdout);

下面是我所看到的输出:

-gt-

共有1个答案

呼延弘方
2023-03-14

正如您的问题的注释中所指出的,pthreads互斥并不能保证公平性。

此作业的正确工具是一个共享标志变量,由互斥体保护,并使用条件变量等待:

pthread_cond_t cond = PTHREAD_COND_INITIALIZER;
pthread_mutex_t lock = PTHREAD_MUTEX_INITIALIZER;
int flag = 0;

奴隶等待旗帜:

pthread_mutex_lock(&lock);
while (!flag)
    pthread_cond_wait(&cond, &lock);
pthread_mutex_unlock(&lock);
pthread_mutex_lock(&lock);
flag = 1;
pthread_cond_signal(&cond);
pthread_mutex_unlock(&lock);
 类似资料:
  • 我尝试过阅读指南和教程来异步/等待,但我似乎找不到这个地址。 以下是相关代码: 我们看到“Func1”和“Func2”立即一个接一个地打印出来。5秒后,即func2中指定的超时,我们将打印“10”和“20”。到现在为止,一直都还不错。 但是如果我把最后一点代码改成这样: 然后我看到“Func1”立即被打印出来,但是“Func2”也被打印出来,即使在它前面。100毫秒后为“10”,5秒后为“20”。

  • 问题内容: 我已经为此奋斗了2天,尽我所能用Google搜索和stackoverflow,但是我无法解决。 我正在构建一个简单的节点应用程序(+ Express + Mongoose),其登录页面重定向到主页。这是我的服务器JS代码: 登录页面向发出POST请求,在此验证发布的数据。这可行。我可以在Node控制台中看到“我们在这里:’/ credentials’”。 然后是问题:res.redir

  • chrome浏览器 onclick链接 O:https://www.w3schools.com窗口打开 X:about:空白窗口打开

  • 我有一些流处理代码,它接受一个单词流并对它们执行一些操作,然后将它们简化为一个,其中包含单词作为键,单词的出现次数作为值。为了代码的简洁性,我使用了jOOL库的类,其中包含许多有用的快捷方法。 类型中的方法不适用于参数 type未定义此处适用的 为什么的行为与有任何不同,我(也许是天真地)认为它是直接等效的,为什么编译器在使用它时不能处理它? (是的,我知道我可以通过将以前的应用程序移到操作中来删

  • 问题内容: 我正在使用Java和Selenium编写测试。我需要将另一个元素内的最后一个元素,所以我使用函数,但问题是,当我申请时,它并不总是带给我最后一个: 至 得到,它带给我: 但是当我将其应用于: 它带给我: 问题答案: 这是XPath混乱的常见原因。 首先是简单的部分: 选择文档中的所有元素。 选择文档中属于元素后代的所有元素。 到目前为止,正常的东西。 接下来是棘手的部分: 要在 兄弟姐

  • 问题内容: 根据JavaDoc for ,该函数在比较期间不考虑比例。 现在,我有一个测试用例,看起来像这样: 我希望函数返回的值是10,小数位数为10。打印该值可显示预期的结果。但是该功能似乎并未按照我认为的方式工作。 这里发生了什么? 问题答案: 并 没有 代表0.7。 它代表0.69999999999999999999555910790149937383830547332763671875(