在最近学习了Grand Central Dispatch之后,我发现多线程代码非常直观(使用GCD).我喜欢这样一个事实,即不需要锁(事实上它在内部使用无锁数据结构),并且API非常简单.
现在,我开始学习pthreads,我不禁对复杂性感到不知所措.线程连接,互斥体,条件变量 - 所有这些事情在GCD中都不是必需的,但在pthreads中有很多API调用.
pthreads是否比GCD有任何优势?它效率更高吗?是否存在正常使用情况,其中pthreads可以执行GCD无法执行的操作(不包括内核级软件)?
在跨平台兼容性方面,我并不太关心.毕竟,libdispatch是开源的,Apple已经将其关闭更改作为GCC的补丁,clang支持关闭,并且已经(从FreeBSD开始),我们开始看到一些非Apple的GCD实现.我最感兴趣的是使用API(具体的例子会很棒!).
在使用pthreads的C++中,如果你的一个线程调用fork,你的其他线程会发生什么?
似乎线程不遵循.在我的情况下,我正在尝试创建一个守护进程,我使用fork()与父进程deamonize它.但是,在通过代码的新路径中,我在fork之前创建了一些线程,之后又创建了一些线程.是否有一种简单的方法可以将线程的所有权更改为新的分叉进程,而不是在fork之后移动我的所有线程创建?
什么是POSIX取消点?我正在寻找POSIX取消点的确切列表.
我这么问是因为我有一本书,说accept()和select()是取消点,但我已经看到了在互联网上声称,他们没有网站.
此外,如果Linux取消点与POSIX取消点不同,我也想要它们的列表.
我在POSIX/Linux环境中有一个多线程应用程序 - 我无法控制创建pthreads的代码.在某些时候,进程 - pthreads的所有者 - 收到一个信号.
该信号的处理程序应该中止,取消或停止所有pthread并记录运行的pthreads数量.
我的问题是我找不到如何列出正在运行的所有pthread.
使用pthreads,如何在C中初始化静态的互斥量数组?
对于单个静态互斥锁,似乎我可以使用PTHREAD_MUTEX_INITIALIZER.但是它们的静态数组呢?例如,在
#include <pthread.h> #define NUM_THREADS 5 /*initialize static mutex array*/ static pthread_mutex_t mutexes[NUM_THREADS] = ...?
或者必须动态分配?
关于Linux上相同进程的线程之间的上下文切换成本是否有任何好的经验数据(x86和x86_64,主要是感兴趣的)?我说的是一个线程在自动或非自愿地进入睡眠状态之前在用户空间中执行的最后一个指令之间的周期数或纳秒数,以及在同一个CPU /核心唤醒后执行相同进程的不同线程的第一条指令.
我编写了一个快速测试程序,它不断执行rdtsc分配给同一个cpu/core的2个线程,将结果存储在volatile变量中,并与其姐妹线程的相应volatile变量进行比较.第一次检测到姐妹线程值的变化时,它会打印差异,然后返回循环.我在Atom D510 cpu上以这种方式获得了大约8900/9600个周期的最小/中值计数.这个程序看起来是否合理,数字看起来是否可信?
我的目标是估计在现代系统上,每个连接线程的服务器模型是否可以与选择型多路复用竞争甚至优于选择类型的多路复用.这似乎在理论上可行,因为从FD执行IO的过渡X金融衍生工具Y涉及仅仅会在一个线程睡眠,而在另一个醒来,而不是多个系统调用,但它是依赖于上下文切换的开销.
我正在为一个调度队列制作一个ac文件,该队列获取一个任务并将其放入一个链接列表的队列中.为了做到这一点,我需要使用创建线程
pthread_t cThread;
if(pthread_create(&cThread, NULL, work, param)){
perror("ERROR creating thread.");
}
Run Code Online (Sandbox Code Playgroud)
但是我需要创建另一个作为'work'和'param'变量的函数作为create function的参数.我的朋友告诉我,我只需要在无限循环的工作函数中放入任何代码,这样线程就不会死.任何人都可以解释每个参数进入pthread_create函数 - 特别是对于work和param?我搜索谷歌这个,但大多数教程都很难理解这个概念......
pthread问题;
看来条件变量只有在另一个线程调用pthread_cond_notify之前调用pthread_cond_wait时才有效.如果在等待之前以某种方式通知,则等待将被卡住;
我的问题是; 什么时候应该使用条件变量?调度程序可以抢占线程并在等待之前通知发生;
等待信号量没有这个问题 - 这些有一个计数器,还是什么时候条件变量更好?
这是一个测试
#include <pthread.h>
#include <stdio.h>
#include <stdlib.h>
// test of conditional variables;
// if cond-var is notified before wait starts, then wait never wakes up !!!
// better to use semaphores than this crap.
pthread_mutex_t cond_var_lock = PTHREAD_MUTEX_INITIALIZER;
pthread_cond_t cond_var = PTHREAD_COND_INITIALIZER;
int wait_first = 1;
void *tfunc(void *arg)
{
(void) arg;
if (!wait_first)
sleep(1);
fprintf(stderr,"on enter cond_var_lock %lx\n", pthread_self());
pthread_mutex_lock( &cond_var_lock);
fprintf(stderr,"before pthread_cond_wait %lx\n", pthread_self());
pthread_cond_wait( &cond_var, &cond_var_lock);
fprintf(stderr,"after pthread_cond_wait %lx\n", pthread_self()); …Run Code Online (Sandbox Code Playgroud) 我尝试将结构作为第4个参数传递,同时使用pthread_create()类似这样的东西:
pthread_create(&tid1, NULL, calca, &t); //t is the struct
Run Code Online (Sandbox Code Playgroud)
现在每当我尝试访问结构中的变量-ta,tb或tc时,我都会收到错误 - 请求成员不是结构或联合.
我可以使用什么替代方法将结构传递给线程?