标签: pthreads

pthread是如何工作的?

我在Java和C#的多线程编程方面经验丰富,并开始学习如何在Linux上使用C语言.我在Linux上的编程意义上"长大",所以我理解它的高级内存哲学,流程处理等.

我的问题不是如何进行线程化.我想知道pthread实际上是如何做到的.它是否为您分叉进程并以某种方式处理您的进程间通信?或者它只是管理地址空间?我想要细节......谷歌搜索只产生了"怎么做"的问题,而不是"如何运作".

c multithreading pthreads

20
推荐指数
2
解决办法
7027
查看次数

使用pthread_create时valgrind内存泄漏错误

我正在使用pthread库编写程序.当我用命令valgrind --leak-check = full运行我的程序时,我得到以下错误描述:

==11784==  
==11784== **HEAP SUMMARY:**  
==11784==     in use at exit: 4,952 bytes in 18 blocks  
==11784==   total heap usage: 1,059 allocs, 1,041 frees, 51,864 bytes allocated  
==11784==  
==11784== **288 bytes** in 1 blocks are possibly lost in loss record 2 of 3  
==11784==    at 0x4C2380C: calloc (vg_replace_malloc.c:467)  
==11784==    by 0x4010D2E: _dl_allocate_tls (dl-tls.c:300)  
==11784==    by 0x55DC218: **pthread_create**@@GLIBC_2.2.5 (allocatestack.c:570)  
==11784==    by 0x401BC0: initdevice(char*) (in /a/fr-01/vol/home/stud/lim/workspace  /Ex3/l)  
==11784==    by 0x406D05: main (in /a/fr-01/vol/home/stud/lim/workspace/Ex3/l)  
==11784==  
==11784== **4,608 bytes** in 16 blocks …
Run Code Online (Sandbox Code Playgroud)

c++ valgrind memory-leaks pthreads

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

C:用pthreads制作poolthread的方法是什么?

我有一个工作队列,我想建立一个4个线程的池,我可以把我的工作.我所坚持的是如何制作线程并在没有工作的情况下让它们暂停.

JOB QUEUE        | job1 | job2 | job3 | job4 | ..

THREAD POOL      | thread1 | thread2 | thread3 | thread4 |
Run Code Online (Sandbox Code Playgroud)

要创建我目前处于初始化点的线程:

for (t=0; t<num_of_threads; t++){
    pthread_create(&(threads[t]), NULL, doSth2, NULL);
}
Run Code Online (Sandbox Code Playgroud)

num_of_threads = 4且doSth2是一个内部没有任何内容的函数.所以一旦我创建了4个线程并且完成了doSth2,我怎么能给他们新的工作呢,而不会杀死他们?

c pthreads reusability threadpool

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

主线程退出,还有其他退出吗?

我在同一个进程中有关于主线程和其他线程的问题.当主函数返回时,其他线程也退出?我有些困惑.我写了一些测试代码,如下所示:

void* test1(void *arg)
{
    unsigned int i = 0;
    while (1){
        i+=1;
    }
    return NULL;
}

void* test2(void *arg)
{
    long double i = 1.0;
    while (1){
        i *= 1.1;
    }
    return NULL;
}

void startThread ( void * (*run)(void*), void *arg) {
  pthread_t t;
  pthread_attr_t attr;
  if (pthread_attr_init(&attr) != 0
      || pthread_create(&t, &attr, run, arg) != 0
      || pthread_attr_destroy(&attr) != 0
      || pthread_detach(t) != 0) {
    printf("Unable to launch a thread\n");
    exit(1);
  }
}

int main()
{
    startThread(test1, …
Run Code Online (Sandbox Code Playgroud)

c multithreading pthreads

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

如何在C++中创建高效的多线程任务调度程序?

我想用C++创建一个非常有效的任务调度程序系统.

基本的想法是这样的:

class Task {
    public:
        virtual void run() = 0;
};

class Scheduler {
    public:
        void add(Task &task, double delayToRun);
};
Run Code Online (Sandbox Code Playgroud)

在后面Scheduler,应该有一个固定大小的线程池,它运行任务(我不想为每个任务创建一个线程).delayToRun意味着task不会立即执行,但会在delayToRun几秒后执行(从添加到其中的点开始测量Scheduler).

(当然,这delayToRun意味着"至少"值.如果系统被加载,或者我们从调度程序中询问不可能,它将无法处理我们的请求.但它应该尽力而为)

这是我的问题.如何delayToRun有效地实现功能?我试图通过使用互斥锁和条件变量来解决这个问题.

我看到两种方式:

用经理线程

调度程序包含两个队列:allTasksQueuetasksReadyToRunQueue.任务被加入allTasksQueueScheduler::add.有一个管理线程,其等待的时间量最小,因此它可以从把一个任务allTasksQueuetasksReadyToRunQueue.工作线程等待可用的任务tasksReadyToRunQueue.

如果Scheduler::add在前面添加一个任务allTasksQueue(一个任务,其值为delayToRunso,它应该在当前最快运行任务之前),那么管理器任务需要被唤醒,因此它可以更新等待时间.

这种方法可以被认为是低效的,因为它需要两个队列,并且它需要两个condvar.signals来运行任务(一个用于allTasksQueue- > tasksReadyToRunQueue,一个用于表示工作线程实际运行任务)

没有经理线程

调度程序中有一个队列.任务将添加到此队列中Scheduler::add.工作线程检查队列.如果它是空的,它会在没有时间限制的情况下等待.如果它不为空,则等待最快的任务.

  1. 如果只有一个条件变量为工作线程等待:这个方法可以被认为是低效的,因为如果在队列前面添加了一个任务(前面意味着,如果有N个工作线程,那么任务索引<N)然后需要唤醒所有工作线程以更新他们等待的时间.

  2. 如果每个线程都有一个单独的条件变量,那么我们可以控制唤醒哪个线程,所以在这种情况下我们不需要唤醒所有线程(我们只需要唤醒具有最大等待时间的线程) ,所以我们需要管理这个值).我目前正在考虑实现这一点,但确切的细节是很复杂的.有关此方法的任何建议/想法/文件吗?


有没有更好的解决方案来解决这个问题?我正在尝试使用标准C++功能,但我愿意使用平台依赖(我的主要平台是linux)工具(如pthreads),甚至是linux特定工具(如futexes),如果它们提供了更好的解决方案.

c++ linux multithreading pthreads task

20
推荐指数
3
解决办法
5695
查看次数

如何在Linux上的c中睡眠或暂停PThread

我正在开发一个我做多线程的应用程序.我的一个工作线程在窗口小部件上显示图像.另一个线程播放声音.我想在按钮单击事件上停止/暂停/暂停/休眠线程.和点击视频播放器播放/暂停按钮时相同.我正在使用pthread库进行线程化在linux平台上用c ++开发我的应用程序.

有人能告诉我如何实现线程暂停/挂起吗?

c c++ pthreads

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

对于pthread,如何从主线程中杀死子线程

我使用pthread_create创建了几个子线程.一次,主线程想要杀死所有子线程或者会有段falut.我应该用哪种功能来完成它?我从谷歌搜索了答案,得到了像pthread_kill这样的功能.但是我不知道应该向子线程发送哪个信号来杀死它们.我的运行环境是RHEL 5.4,编程语言是C.

c linux multithreading pthreads

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

NPTL和pthread令人困惑

NPTL和POSIX线程之间的基本区别是什么?这两个是如何进化的?

linux posix pthreads nptl

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

如何在linux中配置pthread互斥?

我想知道如何配置pthread互斥锁以查看我的代码中是否存在任何锁定争用点.(谁喜欢有争议的代码,对吧?:)我知道如何对代码进行更一般的分析,正如我在这里提到的那样.但我想知道是否有任何工具或选项可用于配置互斥锁定,这将提供有关互斥锁定争用的指标/统计数据,以查看我是否有任何问题区域.

这是一些背景和背景:

最近我使用Cavium Octeon CPU开发了一个嵌入式C++项目.Octeon SDK使用自旋锁实现互斥式样式同步.通过Octeon文档,我发现了一种分析自旋锁的方法,以便能够看到每个自旋锁在等待锁变为可用时必须旋转多少次.要使用它,我必须进行条件编译,然后每次自旋锁旋转时它会递增一个计数器,然后我可以查询微调器等待值.所以,我所做的是封装自旋锁并添加了为系统中使用的所有自旋锁转储自旋锁微调器等待值的功能.实际价值并没有多大意义,但有一些与其他人相比具有非常高的价值,我专注于减少对这些人的争论.

我知道这对于自旋锁来说可能相当容易,因为它只是每次旋转一个计数器,但通过相关的pthread手册页和头文件读取我没有找到类似的东西,是否有可用于pthread互斥锁?

我真的很想避免像每个锁之前和之后花时间做一些hacky.

PS:互斥体的复数是多少?互斥,muteces,mutexi,muti ??? 互斥量从来没有对我说话.

c c++ performance mutex pthreads

19
推荐指数
1
解决办法
7787
查看次数

CLOCK_MONOTONIC和pthread_mutex_timedlock/pthread_cond_timedwait

pthread_mutex_timedlock文档abs_timeout需要CLOCK_REALTIME.但是,我们都知道,对于特定持续时间的计时(由于系统时间调整)是不合适的.

有没有办法让pthread锁定超时CLOCK_MONOTONIC可移植?pthread_cond_timedwait也是如此.

c c++ linux mutex pthreads

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