pthreads 相关问题

Pthreads(POSIX Threads)是一个标准化的基于C的API,用于创建和操作线程。它目前由POSIX.1-2008(IEEE Std 1003.1,2013 Edition / The Open Group Base Specifications Issue 7)定义。

用条件向特定 pthread 发出信号

我正在使用 pthreads 和信号量,并且我正在尝试找出如何向特定线程发出信号。 我想用特定条件发出信号的线程将是正在等待的线程...

回答 1 投票 0

Windows 10 上的 ghci 错误:无法加载用户指定的 .o/.so/.DLL(addDLL:pthread

我已经在 Windows 10 上安装了 Haskell Platform 版本 8.2.2(完整版,64 位)。ghc 可以工作,WinGHCi 也可以。有几个问题: -- 在 cygwin 中运行 ghci 会出现此错误: GHCi,版本 8.2...

回答 4 投票 0

线程在加入之前退出

请原谅我,我刚刚开始了解多线程的概念,我只是想知道为什么我的线程可能会在加入之前退出。本质上,我正在维护进程 ID 的全局列表...

回答 2 投票 0

是什么让 pthread 成为“主”线程?

是什么让 pthread 成为“主线程”? 我这样问是因为某些 GLFW 函数只能从主线程调用。我了解线程安全的概念。但有什么特别的...

回答 1 投票 0

有时我的二进制信号量没有等待正确的时间

有时等待的时间不够长。我可能错过了一些简单的东西 - 但我找不到它。为什么等待函数有时会过早返回 #定义SEMAPHORE_MAXWAIT -1 #定义

回答 1 投票 0

有时我的二进制信号量无法等待正确的时间

有时等待的时间不够长。我可能错过了一些简单的东西 - 但我找不到它。为什么等待函数有时会过早返回 #定义SEMAPHORE_MAXWAIT -1 #定义

回答 1 投票 0

pthread_atfork如何让子进程保证锁状态而不改变父进程锁状态?

我在理解 pthread_atfork 如何使子进程确保互斥状态时遇到一些问题。手册告诉我在创建子进程之前使用prepare获取锁......

回答 1 投票 0

如何在测试用例中刻意造成死锁,稳定防范并发bug?

想象一下我有一个复杂的测试用例,偶尔会导致两个线程死锁。我认为,在 CI 中运行来防止并发 bug 是不合适的。我想写一个简单的测试用例来...

回答 1 投票 0

pthread_setschedparam 无法在带有 mingw64 的 GCC 上工作

我尝试在安装了 GCC v13.2.0 的 Windows 11 上运行此处的示例代码(MSYS2、UCRT 运行时): #包括 #包括 #包括 #包括<...

回答 1 投票 0

C语言有没有办法减少线程的堆大小?

地块图 我使用Valgrind的Massif功能来检查我的C语言程序的内存使用情况,以调查内存使用情况。 我的代码中有很多动态分配,但根据 Massif 的说法,我...

回答 1 投票 0

在linux中使用命令行检查单个线程优先级

我可以通过转到 /proc/$(pidof task)/ 并给出来查看应用程序中使用的线程数 猫的状态。 有没有办法使用命令检查Linux中各个线程的优先级? 重新...

回答 4 投票 0

如何仅使用 pthread 互斥体来同步多个线程?

我试图创建三个线程,每个线程打开一个不同的输入文件,从中读取单个字符并将其设置为全局变量,然后等待下一个线程读取单个字符...

回答 1 投票 0

如果等待时间为0,是否定义了sem_timedwait

如果等待时间为0,是否定义了sem_timedwait,或者在这种情况下我应该调用sem_trywait吗?文档不清楚,源代码仅显示实现。

回答 1 投票 0

为什么使用线程时一条指令有时会被执行两次 C

我有以下代码,它基本上创建两个线程,一个读取一个字符,另一个键入它直到传递字母 f : 字符c; int att = 1; 无效* th_read(无效*k){ ...

回答 1 投票 0

为什么pthread_join()的第二个参数是一个**,一个指向指针的指针?

我对使用 pthread 很陌生,而且对指向指针的指针也不太熟悉。有人可以解释为什么 pthread_join() 的第二个参数是 void ** 吗?为什么要这样设计呢。 ...

回答 2 投票 0

CMake:无法创建目标,因为已存在另一个同名目标

我正在尝试使用 cmake 安装 plexe-sumo。我按照 plexe.car2x.org 上的教程进行操作,结果如下: -- CMAKE_BUILD_TYPE:发布 -- CMAKE_BINARY_DIR: /home/cc/src/plexe-sumo/build-rele...

回答 1 投票 0

pthread 在释放锁之前被取消

我对 C 中的多线程还很陌生。我编写了一个简单的程序,它执行以下操作: main 函数启动多个线程,每个线程等待使用 con...

回答 1 投票 0

dbus-cxx 阻塞主线程直到DBUS连接断开

我正在使用 dbus-cxx 库在使用 DBUS 的程序之间进行通信。然而,我感到困惑的一部分是如何在服务器上打开连接时保持主线程不退出

回答 1 投票 0

在 Rust 中仅向当前线程发送 SIGTERM 信号

使用 nix::sys::signal::{self, SigSet}; #[东京::测试] 异步 fn test_shutdown() { 让服务器 = TestServer::new().await; 让 proxy = ProxyUnderTest::new(server.listen_port).await; 睡眠(标准::时间::

回答 1 投票 0

信号量未使用 sem_open 正确初始化

我正在尝试用信号量来实现生产者和消费者问题。我认为我的逻辑是正确的,但我的代码没有按预期工作。 #包括 #包括 我正在尝试用信号量来实现生产者和消费者问题。我认为我的逻辑是正确的,但我的代码没有按预期工作。 #include <stdio.h> #include <pthread.h> #include <semaphore.h> #include <unistd.h> #include <fcntl.h> #include <sys/stat.h> #include <stdlib.h> #define BUFFER_SIZE 10 int arr[BUFFER_SIZE]; int position; sem_t *mutex, *empty, *filled; void* producer(void* args){ printf("Prod starting\n"); int a,b; sem_getvalue(empty, &a); sem_getvalue(mutex, &b); printf("empty : %d mutex : %d\n", a, b); do{ sem_wait(empty); sem_wait(mutex); int new = rand()%2000; printf("Adding %d to buffer\n", new); arr[position] = new; position++; sem_post(mutex); sem_post(filled); }while(1); } void* consumer(void* arg){printf("Consumer starting\n"); do{ sem_wait(filled); sem_wait(mutex); position--; printf("Consuming %d from buffer", arr[position]); arr[position] = 0; sem_post(mutex); sem_post(empty); }while(1); } int main() { mutex = sem_open("mutex", O_CREAT, 0644, 1); empty = sem_open("empty", O_CREAT, 0644, BUFFER_SIZE); filled = sem_open("filled", O_CREAT, 0644, 0); pthread_t prod, cons; int a, b,c; sem_getvalue(empty, &a); sem_getvalue(filled, &b); sem_getvalue(mutex, &c); printf("empty:%d filled:%d mutex:%d\n", a,b,c); //printf("Producer = %ld Consumer = %ld\n", prod, cons); pthread_create(&prod,NULL,producer,NULL); pthread_create(&cons,NULL,consumer,NULL); pthread_join(prod,NULL); pthread_join(cons,NULL); sem_close(mutex); sem_unlink("mutex"); sem_close(empty); sem_unlink("empty"); sem_close(filled); sem_unlink("filled"); return 0; } 信号量未正确初始化,从以下输出可知: empty:0 filled:0 mutex:0 Prod starting empty : 0 mutex : 0 Consumer starting 我不明白为什么信号量没有正确初始化。从手册页: sem_t *sem_open(const char *name, int oflag, mode_t 模式, unsigned int 值); 如果在 oflag 中指定了 O_CREAT,则需要两个附加参数 必须提供。 mode 参数指定权限 被放置在新的信号量上,该值 参数指定新信号量的初始值。 注意:我不能使用 sem_init,因为最终代码需要在 Macos 上完成。我只是用 sem_getvalue() 在 Linux 上重新创建这个来了解问题。 根据@pilcrow的建议,我将问题重新创建为: #include <stdio.h> #include <pthread.h> #include <semaphore.h> sem_t *mutex; void* thread(void* arg){ printf("Entered thread\n"); sem_wait(mutex); printf("Hello\n"); sem_post(mutex); pthread_exit(NULL); } int main() { mutex = sem_open("mutex", O_CREAT, 0644, 1); if(mutex == SEM_FAILED){ printf("Failed to create semaphore\n"); return 1; } pthread_t id; pthread_create(&id,NULL,thread,NULL); pthread_join(id,NULL); return 0; } 输出: Entered thread 线程继续无限期地等待 mutex 信号量,而该信号量再次未正确初始化。 命名信号量由 /somename 形式的名称标识;也就是说,最多为 NAME_MAX-4 的以空结尾的字符串 (即 251)个字符,由一个初始斜杠组成,后跟一个或多个字符,其中没有一个是斜杠。二 通过将相同的名称传递给 sem_open(3),进程可以对同一个命名的信号量进行操作。 sem_open(3)函数创建一个新的命名信号量或打开一个现有的命名信号量。信号量被设置后 打开后,可以使用sem_post(3)和sem_wait(3)进行操作。当进程使用完信号量后,它可以 使用 sem_close(3) 关闭信号量。当所有进程都使用完该信号量后,可以将其从 系统使用 sem_unlink(3). 多个进程可以打开同一个信号量,这意味着它必须存在于进程范围之外的某个地方 它需要手动取消链接,这表明即使每个打开它的进程都调用了sem_close(),它仍然存在(否则当引用计数变为零时它可能会被销毁)。 在 Linux 上的 strace 下运行测试过程表明信号量由文件 /dev/shm/sem/mutex 支持。其他平台可能有不同的支持位置,但必须支持相同的语义。 需要手动取消链接信号量的明显推论是,如果您不,那么每次您使用相同的名称打开它时都会得到相同的信号量,其中包含先前运行的最后一个值。 如果您确实只想在单个进程中使用信号量并且不能使用未命名的信号量(使用 sem_init()),那么您应该确保名称是唯一的。从 PID 形成一个字符串将是一个好的开始,退出时取消链接也是如此。

回答 1 投票 0

© www.soinside.com 2019 - 2024. All rights reserved.