Tag: pthreads

pthread线程状态

是否有一种机制可以用来判断pthread线程当前是否正在运行,或者已经退出? 是否有一个pthread_join()方法,如果线程尚未退出,它可以在特定时间段后超时?

我可以使用pthread_kill停止(暂停)pthread执行

如果我发送SIGTSTP信号,线程会停止吗? 或者换句话说,它会像SIGTSTP和SIGCONT上的进程一样吗? 提前致谢。

使用pthread在C中生成随机数的最正确方法是什么

我有几个并发运行的线程,每个线程都必须生成随机数。 我想了解是否存在要遵循的模式,以了解在主线程中使用srand初始化随机生成器是否正确,或者每个线程是否必须初始化其自己的随机生成器。 似乎rand / srand没有被设计为与线程一起使用,我想知道如何处理线程和随机数。 谢谢 编辑:我需要纯随机数,但我也有兴趣为测试目的生成确定性序列。 我在Linux上,但我更喜欢尽可能地编写代码。

为什么start_routine for pthread_create返回void *并取无效*

pthread_create的函数头如下所示: int pthread_create(pthread_t * thread, const pthread_attr_t * attr, void * (*start_routine)(void *), void *arg); 我理解这一切除了start_routine的函数指针的forms为void* (*fpointer) (void*) ,这意味着它接受一个void指针并返回一个void指针 。 它所采用的void指针只是一种将参数传递给start_routine的方法,我得到了那个部分,但是我不明白为什么函数会返回一个void指针? 什么代码甚至会注意到void指针?

我是否被迫使用pthread_cond_broadcast(通过pthread_cond_signal)以保证* my * thread被唤醒?

在一些QT GUI线程(一个pthread线程)与一些C代码连接的上下文中,我偶然发现了以下问题:我启动了QT Gui线程,在我的C线程恢复其路径之前,我需要确保所有的QT Gui线程中的图形对象已经被构造出来并且它们是有效的QObjects(因为C代码将在那些上调用QObject:connect() )。 引言放弃,等待是通过pthread_cond_wait() +条件变量+ C线程中的关联互斥量进行的: int isReady=0; pthread_mutex_lock(&conditionReady_mutex); while(isReady==0) { pthread_cond_wait(&conditionReady_cv, &conditionReady_mutex); } pthread_mutex_unlock(&conditionReady_mutex); 另一方面,QT Gui线程构造其图形对象,然后用以下信号发出信号: pthread_mutex_lock(&conditionReady_mutex); isReady=1; pthread_cond_broadcast(&conditionReady_cv); pthread_mutex_unlock(&conditionReady_mutex); 基本的东西,如你所见。 但问题是:在Qt Gui线程中,我一直在使用pthread_cond_broadcast() ,以确保我的C线程被唤醒,当然。 是的,在我当前的应用程序中,我只有一个C线程和一个Qt Gui线程,并且pthread_cond_signal()应该完成唤醒C线程的工作(因为它保证唤醒至少一个线程,并且C线程是唯一的一个)。 但是,在更一般的上下文中,假设我有三个C线程,但我希望它们中的一个(或两个)被唤醒。 一个(两个)特定线程。 我该如何确保? 如果我使用pthread_cond_signal() ,那么只能唤醒第三个线程,这将完全错过这一点,因为我感兴趣的一个线程没有被唤醒。 OTOH,通过pthread_cond_broadcast()唤醒所有线程,甚至是那些不需要的线程,这些都是过度的。 有一种方法可以告诉pthread_cond_signal()唤醒哪个线程? 或者,我是否应该引入更多的条件变量,以便在使用pthread_cond_broadcast()唤醒的线程组中获得更精细的粒度? 谢谢。

如何用C杀死管理线程?

我有以下代码。 构建应用程序是myprogram。 如果我启动myprogram然后killall myprogram,然后我立即启动myprogram,然后myprogram崩溃。 崩溃原因是由于第一次启动创建的管理线程在第二次启动之前未正确清除。 所以在第二次启动时,myprogram试图用pthread创建线程,旧的线程管理还没有被删除,所以它会导致崩溃。 有没有办法在我第一次启动时或在我第二次使用C启动时开始杀死管理线程? #include #include #include pthread_t test_thread; void *thread_test_run (void *v) { int i=1; while(1) { printf(“into thread %d\r\n”,i); i++; sleep(1); } return NULL } int main() { // ps aux | grep myprogram —> show 1 myprogram (1 for the main application) pthread_create(&test_thread, NULL, &thread_test_run, NULL); // ps aux […]

睡在线程中(C / POSIX线程)

我正在开发一个使用POSIX线程的multithreading应用程序。 我正在使用线程来做一个定期的工作,为此我正在使用usleep(3)来暂停线程执行。 我的问题是如何从主线程取消usleep()计时器,我尝试了pthread_kill(thread, SIGALRM)但它具有全局效果,导致主应用程序终止(默认情况下)。 这是我的伪代码: void threaded_task(void *ptr) { initialize(); while(running) { do_the_work(); usleep(some_interval); } clean_up(); release_resources(); } 这里是伪函数,用于从主线程停止(并正常关闭 )给定线程 : void stop_thread(pthread_t thread) { set_running_state(thread, 0); // Actually I use mutex staff // TODO: Cancel sleep timer so that I will not wait for nothing. // Wait for task to finish possibly running work […]

如何ptracemultithreading应用程序?

编辑(制作进展): 我试图ptrace一个vsftpd守护进程。 我有以下代码附加到守护程序。 然后它成功显示第一个衍生进程的PID。 然而,对于这个衍生进程的子进程,它返回PID为2,3,..程序确实捕获了生成进程的退出,这让我觉得我很接近。 有任何想法吗? void * trace_process(void * pid){ pid_t child = atoi((char *) pid); long orig_eax, eax; int status; int callmade = FALSE; long opt = PTRACE_O_TRACEFORK; long newpid; long trace = ptrace(PTRACE_ATTACH,child,NULL,NULL); ptrace(PTRACE_SETOPTIONS,child,NULL,opt); if(trace == FALSE) printf(“Attached to %d\n”,child); while(TRUE) { child = waitpid(-1, &status, __WALL); if (status >> 16 == […]

pthread中的读/写锁

我正在学习pthread并遇到了读者作家锁。 场景非常简单; 一个全局变量被所有线程共享,读者继续打印同一个全局变量的当前值,而writer将更新同一个变量。 我可以通过使用两个互斥锁(pthread_mutex_t)来实现此同步,但我想使用“一个”读写器锁来实现相同的结果。 但是,使用一个读写器锁,如此处所示(程序的输出,如下),读者只能看到x的第一个值,并且看不到对全局变量的任何更新。 请点亮这里。 码: #include #include #include #include #include #define ACCESS_ONCE(x) (*(volatile typeof(x) *)&(x)) int x = 0; pthread_rwlock_t lock_rw = PTHREAD_RWLOCK_INITIALIZER; void *reader_thread(void *arg) { int i; int newx, oldx; newx = oldx = -1; pthread_rwlock_t *p = (pthread_rwlock_t *)arg; if (pthread_rwlock_rdlock(p) != 0) { perror(“reader_thread: pthread_rwlock_rdlock error”); exit(__LINE__); } for […]

线程特定数据与线程本地存储

我读过Kerrisk的Linux编程接口:Linux和UNIX系统编程手册 ,第31章关于线程。 本章包括线程特定数据(第31.3.4节)和线程本地存储(第31.4节)。 第663-669页介绍了这些主题。 线程特定数据( pthread_key_create , pthread_setspecific , pthread_getspecific和friends)看起来更强大,但使用起来似乎更麻烦,并且似乎更频繁地使用内存管理器。 线程本地存储(静态和全局声明上的__thread )看起来不那么强大,因为它仅限于编译时间,但它看起来更容易使用,并且似乎在运行时不在内存管理器中。 我可能对运行时内存管理器有误,因为在遇到__thread变量时,可能会有幕后调用pthread_key_create代码。 Kerrisk没有提供这两种策略的比较/对比,他也没有就何时使用哪种策略提出建议。 为问题添加上下文:我正在评估第三方库。 该库使用全局变量,不使用锁定,我想在multithreading程序中使用它。 该程序使用线程来最小化网络延迟。 有没有赢家? 或者有不同的场景可以保证使用其中一种吗?