如何阻止 pthread 从 main 打印全局变量,然后继续 pthread?

     2023-02-22     234

关键词:

【中文标题】如何阻止 pthread 从 main 打印全局变量,然后继续 pthread?【英文标题】:How can I block a pthread to print a global variable from main and then continue the pthread? 【发布时间】:2013-04-12 16:17:49 【问题描述】:

我有一个创建 pthread 的主函数。我正在尝试使用信号量(注意-互斥量、s1、s2 和 memoryUsed 都在全局声明)在有选择的时间打印一个全局变量:

int main(int argc, const char * argv[])

    pthread_mutex_init(&mutex, NULL);
    sem_init(&s1, 0, 0);
    sem_init(&s2, 0, 0);

    pthread_t t0;
    pthread_create(&t0, NULL, &matrix_management, NULL);

    sem_wait(&s1); // wait for signal from pthread
    printf("Memory Usage from main: %d bytes\n\n", memoryUsed); // global var
    sem_post(&s2); // signal pthread to continue

    pthread_join(t0, NULL);
    sem_destroy(&s1);
    sem_destroy(&s2);
    pthread_mutex_destroy(&mutex);
    return 0;

在我的目标函数中,我想在一个选择点停止并从 main 打印一个全局变量。请注意,变量在目标函数中已更改。打印后,我想继续目标功能:

void *matrix_management(void *len)

    pthread_mutex_lock(&mutex);

    // CHANGE GLOBAL VAR
    memoryUsed = 1;

    sem_post(&s1); // print from main
    sem_wait(&s2); // wait for signal

    // continue thread...


    pthread_mutex_unlock(&mutex);
    return NULL;

然而,主线程似乎根本没有等待来自 pthread 的信号。它立即打印其全局变量的值。如果我注释掉 pthread 中的信号,程序就不会死锁。你能像这样在 MAIN 线程和 pthread 之间使用信号量吗?

【问题讨论】:

【参考方案1】:

根据您的平台,可能不支持未命名的信号量。在这种情况下,以下内容将起作用,尽管您可能希望创建临时名称并稍后将它们用于取消链接。我熟悉这一点的唯一原因是因为我通常使用的平台 OS X 不支持 10.8.3 之前的未命名信号量,因此无错误检查我在你的代码中看到了类似的行为,因为所有信号量 API 失败。

希望对你有帮助。

#include <stdio.h>
#include <stdlib.h>
#include <pthread.h>
#include <semaphore.h>
#include <assert.h>

sem_t* s1=NULL, *s2=NULL;
int memoryUsed = 0;

void *matrix_management(void *len)

    // CHANGE GLOBAL VAR
    memoryUsed = 1;

    sem_post(s1); // print from main
    sem_wait(s2); // wait for signal
    printf("Thread woken up.\n");

    // continue thread...
    return NULL;


int main(int argc, const char * argv[])

    s1 = sem_open("s1", O_CREAT, S_IRUSR | S_IWUSR, 0);
    s2 = sem_open("s2", O_CREAT, S_IRUSR | S_IWUSR, 0);
    assert(s1 && s2 && "Failed to allocate semaphores.");

    pthread_t t0;
    pthread_create(&t0, NULL, &matrix_management, NULL);

    sem_wait(s1); // wait for signal from pthread
    printf("Memory Usage from main: %d bytes.\n", memoryUsed); // global var

    printf("Waking thread...\n"); // global var
    sem_post(s2); // signal pthread to continue

    pthread_join(t0, NULL);
    printf("Thread finished\n");
    sem_close(s1);
    sem_close(s2);
    sem_unlink("s1");
    sem_unlink("s2");
    return 0;

输出

Memory Usage from main: 1 bytes.
Waking thread...
Thread woken up.
Thread finished

【讨论】:

这确实是问题所在。对 OS X 不了解。感谢您的帮助!

弹出窗口出现时如何阻止标签栏项目变灰

】弹出窗口出现时如何阻止标签栏项目变灰【英文标题】:howtostoptabbaritemsfromturninggreywhenpopoverappears【发布时间】:2018-06-0715:03:40【问题描述】:我在我的一个视图控制器中显示一个弹出框控制器。每当弹出框出现时,活动标签... 查看详情

使用 Mutex 和 Pthread 库的错误输出

】使用Mutex和Pthread库的错误输出【英文标题】:WrongOutputusingMutexandPthreadLibrary【发布时间】:2015-10-0308:21:04【问题描述】:以下程序的目的是学习Mutex和Pthread库。main()创建三个线程。(线程1、2和3)。每个线程一个接一个地顺序... 查看详情

如何理解函数中的指针

】如何理解函数中的指针【英文标题】:Howtounderstandingpointersinfunctions【发布时间】:2015-02-0423:26:45【问题描述】:我有两个文件,main.c和main2.c。我的经验告诉我,他们应该做同样的事情,但事实并非如此。main.c在main例程之外声... 查看详情

打印具有共同特定变量值的类对象

】打印具有共同特定变量值的类对象【英文标题】:Printclassobjectswithspecificvariablevalueincommon【发布时间】:2019-10-1718:23:58【问题描述】:如果你从同一个类中调用main中的三个对象,如下所示:customerone(856756,"NewYork");customertwo(896557... 查看详情

如何阻止 WPF KeyDown 事件从某些包含的控件(例如 TextBox)冒泡?

】如何阻止WPFKeyDown事件从某些包含的控件(例如TextBox)冒泡?【英文标题】:HowdoIstopWPFKeyDowneventsfrombubblingupfromcertaincontainedcontrols(suchasTextBox)?【发布时间】:2014-09-1210:06:42【问题描述】:我的程序很大,并且使用WPF,我想要一... 查看详情

如何从运行时参数初始化常量全局变量?

】如何从运行时参数初始化常量全局变量?【英文标题】:HowdoIinitializeaconstantglobalvariablefromaruntimearguments?【发布时间】:2021-05-1820:44:24【问题描述】:因此,我在这里看到了有关如何通过提示用户输入然后使用cin在运行时设置... 查看详情

为啥从 Info.plist 中删除“Main nib file base name”会阻止应用程序执行?

】为啥从Info.plist中删除“Mainnibfilebasename”会阻止应用程序执行?【英文标题】:Whydoesremoving"MainnibfilebasenamefromInfo.plist"preventapplicationexecution?为什么从Info.plist中删除“Mainnibfilebasename”会阻止应用程序执行?【发布时间】... 查看详情

如何从另一个类打印行

】如何从另一个类打印行【英文标题】:Howtoprintlinesfromanotherclass【发布时间】:2017-05-2906:10:20【问题描述】:更新我一直都错了。我用我正在使用但没有在此处添加的方法阻止了输出。现在它运行良好,我可以从其他进程中写... 查看详情

如何从循环外部杀死处于无限循环中的 pthread?

】如何从循环外部杀死处于无限循环中的pthread?【英文标题】:HowcanIkillapthreadthatisinaninfiniteloop,fromoutsidethatloop?【发布时间】:2011-12-1903:34:16【问题描述】:我创建了一个线程并将其放入无限循环中。使用valgrind检查代码时出现... 查看详情

Pthread C 同步

】PthreadC同步【英文标题】:PthreadCsyncronization【发布时间】:2012-04-3015:47:00【问题描述】:我从线程开始,我在解决这个问题时遇到了一些问题:这个程序产生一个有序的数字序列,第二个任务读取它们并将它们打印在屏幕上。... 查看详情

使用 pthread 从终端写入和读取

】使用pthread从终端写入和读取【英文标题】:Writingandreadingfromterminalusingpthreads【发布时间】:2013-01-2001:25:17【问题描述】:我想在C中使用pthreads创建一个多线程应用程序。我想让一些工作线程在后台做一些事情,但是每隔一段... 查看详情

如何从打印页面中删除 URL?

】如何从打印页面中删除URL?【英文标题】:HowtoremovetheURLfromtheprintingpage?【发布时间】:2010-10-0918:33:23【问题描述】:我想删除打印在页面底部的URL。喜欢:yomari.com/.../main.php?sen_n如何省略或防止打印?更具体地说,有什么方法... 查看详情

如何从 cython 设置文件中删除 -pthread 编译器标志

】如何从cython设置文件中删除-pthread编译器标志【英文标题】:Howtoremove-pthreadcompilerflagfromcythonsetupfile【发布时间】:2019-11-2413:44:27【问题描述】:在linux环境中,当我运行cython的设置脚本时,我得到了gcc-pthread-B/apps/.../compiler_comp... 查看详情

如何从父线程中提取pthread的taskid(tid)?

】如何从父线程中提取pthread的taskid(tid)?【英文标题】:Howtoextracttaskid(tid)ofapthreadfromtheparentthread?【发布时间】:2019-06-1320:23:39【问题描述】:我正在使用std::thread来启动线程。另外,我需要/proc/[pid]/tasks/[tid]提供的工作线程... 查看详情

将 plsql 变量值从匿名块打印到 Java

】将plsql变量值从匿名块打印到Java【英文标题】:printplsqlvariablevaluefromanonymousblocktoJava【发布时间】:2016-04-1509:02:47【问题描述】:我正在尝试用Java打印plsql变量值(l_console_message)。但是,这种方法似乎不起作用。我相信ResultSet位... 查看详情

如何阻止 python RuntimeWarning 打印到终端? [复制]

】如何阻止pythonRuntimeWarning打印到终端?[复制]【英文标题】:HowdoIblockpythonRuntimeWarningfromprintingtotheterminal?[duplicate]【发布时间】:2015-01-0915:34:22【问题描述】:我有一些python代码,在某些时候,它采用带有nans的合理稀疏数组的... 查看详情

如何从 python 中获取变量值并在电子中使用它?

】如何从python中获取变量值并在电子中使用它?【英文标题】:Howtogetvariablevaluefrompythonanduseitinelectron?【发布时间】:2021-08-0919:43:45【问题描述】:我是使用ElectronJS的新手。考虑我在python文件中有变量a="HelloWorld"。我想在我的main... 查看详情

动态加载引用后如何保存全局变量值?

】动态加载引用后如何保存全局变量值?【英文标题】:HowcanIsaveaglobalvariablevalueafterdynamicallyloadingareference?【发布时间】:2011-08-1713:12:29【问题描述】:我有一个Access2003数据库,它将动态加载MDB数据库作为库引用。原因是该数据... 查看详情