标签: pthreads

使用C/Pthreads:共享变量需要是不稳定的吗?

在C编程语言中,Pthreads作为线程库; 在线程之间共享的变量/结构是否需要声明为volatile?假设他们可能受到锁定或不受保护(可能是障碍).

pthread POSIX标准对此有任何发言权,是依赖于编译器还是不依赖于编译器?

编辑添加:感谢您的回答.但是,如果你使用锁,那该怎么办?如果你使用障碍物怎么办?或者使用比较和交换等原语直接和原子地修改共享变量的代码......

c multithreading pthreads

31
推荐指数
3
解决办法
2万
查看次数

pthread互斥量的开销?

我正在尝试使C++ API(对于Linux和Solaris)具有线程安全性,以便可以从不同的线程调用其函数,而不会破坏内部数据结构.在我目前的方法中,我使用pthread互斥锁来保护对成员变量的所有访问.这意味着一个简单的getter函数现在可以锁定和解锁互斥锁,我担心这会产生开销,特别是因为API主要用于单线程应用程序,其中任何互斥锁定看起来都是纯粹的开销.

所以,我想问一下:

  • 您是否有使用锁定的单线程应用程序与不使用锁定的单线程应用程序的性能经验?
  • 与例如相比,这些锁定/解锁呼叫的费用是多少.一个简单的"返回this-> isActive"访问bool成员变量?
  • 你知道更好的方法来保护这种变量访问吗?

c++ linux performance mutex pthreads

31
推荐指数
4
解决办法
3万
查看次数

如何在GDB中调试多线程程序时一次继续一个线程?

我有一个使用两个线程的程序.我已经在两个线程中都设置了断点.在gdb下运行程序时,我想在线程之间切换并使它们运行.(线程t1处于活动状态且正在运行,线程t2;在断点处暂停时.我想停止T1运行并运行T2).

有什么办法可以在gdb中安排线程吗?

linux multithreading gdb pthreads

30
推荐指数
2
解决办法
2万
查看次数

如何在pthreads中的读写锁中防止编写器饥饿

我有一些关于*nix系统上POSIX Pthreads的读写锁的问题,例如Linux.

我想知道读写锁的默认偏差是什么,即它是否更喜欢读写,反之亦然?它是否提供一些api来更改此默认行为.

posix pthread是否提供了一些api,以便我们可以更改pthread_rwlock_t以防止作者饥饿?从我所读到的(如果我错了请纠正我),默认实现偏向于读者线程,因此作者线程可能面临饥饿.

我已经从David Butenhof的Programming with Posix threads一书中读到了rw锁的示例实现.

我想知道posix pthreads如何处理编写器线程的饥饿?是否有一些api使用,我们可以设置读写锁的属性,以防止写饥饿(我从来没有听说过)?或者用户是否必须处理此问题?

如果您认为答案是实现定义的,那么请举例说明它是如何在Linux中完成的,因为这就是我要找的东西.

请注意,我只想要一个*nix系统的解决方案.不要以为我很粗鲁,但发布一些特定于Windows的代码对我来说毫无用处.

谢谢大家的帮助和耐心:)

linux multithreading pthreads

29
推荐指数
1
解决办法
2万
查看次数

gdb:找不到新线程:泛型错误

当我对一个加载.so的程序运行GDB时,该程序链接到pthreads,GDB报告错误"无法找到新的线程:泛型错误".

请注意,我运行的可执行文件未与pthreads链接.

有线索吗?

$ gdb --args lua -lluarocks.require
GNU gdb (GDB) 7.0-ubuntu
Copyright (C) 2009 Free Software Foundation, Inc.
License GPLv3+: GNU GPL version 3 or later 
This is free software: you are free to change and redistribute it.
There is NO WARRANTY, to the extent permitted by law.  Type "show copying"
and "show warranty" for details.
This GDB was configured as "x86_64-linux-gnu".
For bug reporting instructions, please see:
<http://www.gnu.org/software/gdb/bugs/>...
Reading symbols from /usr/bin/lua...(no debugging symbols found)...done.
(gdb) run
Starting …

debugging ubuntu gdb pthreads

28
推荐指数
5
解决办法
2万
查看次数

PThread库的源代码?

我试图找到pthread库的源代码.(我猜它应该是Linux源代码的一部分)

但不知何故找不到任何有它的好网站.

我喜欢这个网站:http://lxr.linux.no/#linux+v2.6.34.1/我经常找到我需要的东西.某种程度上pthread源是不可搜索的.无论如何,我想提一下,我需要一个链接到可浏览(和可搜索)的网站.

浏览linux源代码的网站可能是个人品味的问题.因此欢迎所有指向pthread源的链接.

最有可能的是,我最终会将所有这些书签加入书签,通过它们查看,然后接受最佳答案.

linux open-source pthreads

28
推荐指数
2
解决办法
5万
查看次数

在Java中强制虚假唤醒

这个问题不是关于,虚假的唤醒是否真的很开心,因为这已经在这里全面讨论过:虚假的唤醒真的发生了吗?因此,这也不是为什么我必须围绕我的wait声明循环.这是关于:

我想构建一个虚假唤醒发生的案例.到目前为止我在上面提到的问题中学到的是:

如果发出一个Linux进程的信号,它的等待线程将各自享受一个不错的,热的虚假唤醒.

所以看来这只能用于linux机器,实际上我有Ubuntu 11.04 - 64位.我编写了一个Java程序,其中一个线程正在等待一个条件,但没有循环和另一个类,线程只是等待并被另一个线程通知.我认为在一个JVM中启动所有三个线程会强制执行上述情况,但似乎并非如此.

有没有其他人知道如何在Java中构建这样的案例?

java linux multithreading posix pthreads

28
推荐指数
2
解决办法
3108
查看次数

我应该使用Helgrind还是DRD进行线程错误检测?

看起来Valgrind有两个工具都可以进行线程错误检测:HelgrindDRD.这些工具基本相似.

我的主要问题是:我应该何时使用一个而不是另一个来检查我的多线程代码?

更广泛地说,为什么有两种工具?我认为它们并非完全多余.有什么重要的区别?我是否应该计划通过这两种工具运行我的代码?

c valgrind pthreads

28
推荐指数
1
解决办法
7265
查看次数

在销毁pthread互斥锁之前锁定它是一种好习惯吗?

class AAA
{
    ...
    ~AAA()
    {
        pthread_mutex_lock( &m_mutex );
        pthread_mutex_destroy( &m_mutex );
    }
}
Run Code Online (Sandbox Code Playgroud)

问题>我在项目的某个地方看到了这段代码.这样做是好的做法吗?或者在销毁互斥锁​​之前锁定互斥锁是不确定的行为?

c++ pthreads

28
推荐指数
2
解决办法
1262
查看次数

在Linux上等待多个条件变量而没有不必要的睡眠?

我正在编写一个对延迟敏感的应用程序,它实际上想要一次等待多个条件变量.我之前已经阅读了几种在Linux上获得此功能的方法(显然这是在Windows上构建的),但它们似乎都不适合我的应用程序.我所知道的方法是:

  1. 让一个线程等待你想要等待的每个条件变量,当被唤醒时会发出一个你等待的单个条件变量.

  2. 通过定时等待循环遍历多个条件变量.

  3. 将虚拟字节写入文件或管道,然后轮询这些字节.

#1和#2不合适,因为它们会造成不必要的睡眠.使用#1,你必须等待虚拟线程唤醒,然后发出真实线程的信号,然后唤醒真正的线程,而不是真正的线程刚刚开始唤醒 - 额外的调度程序量子花费在这实际上对我的应用程序很重要,我宁愿不必使用完整的RTOS.#2更糟糕的是,你可能花费N*超时时间睡眠,或者你的超时将是0,在这种情况下你永远不会睡觉(无休止地烧掉CPU和饿死其他线程也很糟糕).

对于#3,管道是有问题的,因为如果"发出信号"的线程忙或甚至崩溃(我实际上处理的是单独的进程而不是线程 - 互斥和条件将存储在共享内存中),那么写入线程将被卡住,因为管道的缓冲区将是满的,任何其他客户端也是如此.文件存在问题,因为应用程序运行的时间越长,它就会无休止地增长.

有一个更好的方法吗?对于适用于Solaris的答案感到好奇.

c multithreading scheduling pthreads conditional-statements

27
推荐指数
3
解决办法
3万
查看次数