Tag: pthreads

互斥和信号量实际上做了什么?

我想要一些关于互斥和信号量的澄清。 我的问题是, 当线程试图进入由互斥锁锁定的区域时,互斥锁实际上做了什么。 它等待锁被释放? 或b。 它进入睡眠状态,直到释放锁定。 在那种情况下,如何在释放锁定时再次唤醒? 与1相同的问题,但在这种情况下它是信号量。 你能给我一些关于C中pthread中忙碌等待的代码,还有线程进入hibernate而不是等待的情况? 睡觉意味着它是阻塞还是睡觉是另一种忙碌的等待? 我想知道一些涵盖这种情况的程序,例如一些c源代码,其中实现繁忙等待,阻塞等。

在为该线程评论pthread_join时多次执行相同的线程子例程

我是线程新手。 这里如果我评论pthread_join(thread1,NULL),那么在输出中有时我会得到 Thread2 Thread1 Thread1 我无法理解为什么Thread1跟踪会出现两次以及pthread_join的确切function是什么。 另外,请参考一些关于初学者的线程概念的教程。 void *print_message_function( void *ptr ); main() { pthread_t thread1, thread2; char *message1 = “Thread 1”; char *message2 = “Thread 2”; int iret1, iret2; iret1 = pthread_create( &thread1, NULL, print_message_function, (void*) message1); iret2 = pthread_create( &thread2, NULL, print_message_function, (void*) message2); pthread_join( thread1, NULL); pthread_join( thread2, NULL); printf(“Thread 1 returns: […]

Unix pthreads和信号:每个线程信号处理程序

我无法让线程捕获正确的信号。 例如, 我首先开始一个主线程(tid 1)。 然后,它使用signal(2) SIGUSR1的信号处理程序设置为function1( signal(2) 。 主线程使用tid 2创建一个新线程。 在线程2中,我使用signal(2) SIGUSR1的信号处理程序注册到function2() signal(2) 。 线程1然后创建线程3(tid 3)。 从线程3,我使用pthread_kill(1, SIGUSR1)向线程1发送信号。 但是, function2()被调用,而不是function1() 。 这种行为是否有意,或者是否需要更改以使这些信号处理程序工作? 编辑:我已经完成了一些调试,结果是信号IS被发送到线程1,但是function2()由于某种原因从线程1调用。 这有解决方法吗?

pthread_t到gdb线程id

有没有人知道从pthread_t到GDB用信息线程显示的方法? 所以我有: (gdb) info threads 37 Thread 22887 0xb7704422 in __kernel_vsyscall () 36 Thread 22926 0xb7704422 in __kernel_vsyscall () 35 Thread 22925 0xb7704422 in __kernel_vsyscall () 34 Thread 22924 0xb7704422 in __kernel_vsyscall () 33 Thread 22922 0xb7704422 in __kernel_vsyscall () 32 Thread 22921 0xb7704422 in __kernel_vsyscall () (gdb) p m_messageQueue->m_creationThread $3 = 2694822768 (gdb) p/x […]

什么是_REENTRANT标志?

编译multithreading程序我们使用gcc如下: gcc -lpthread -D_REENTRANT -o someprogram someprogram.c 标志-D_REENTRANT到底在做什么?

在C ++中执行线程的奇怪顺序

我试图从Linux Tutorial Posix Threads执行第一个例子。 这就是我所拥有的: [alex@Allok c_c++]$ g++ -lpthread from.cpp from.cpp: In function ‘int main()’: from.cpp:10:22: warning: deprecated conversion from string constant to ‘char*’ [-Wwrite-strings] from.cpp:11:22: warning: deprecated conversion from string constant to ‘char*’ [-Wwrite-strings] [alex@Allok c_c++]$ ./a.out Thread 2 Thread 1 Thread 1 returns: 0 Thread 2 returns: 0 问题是我希望输出像源一样说: Thread 1 Thread 2 […]

互斥是否需要在pthreads之间同步一个简单的标志?

让我们假设我有一些工作线程如下: while (1) { do_something(); if (flag_isset()) do_something_else(); } 我们有几个帮助函数来检查和设置标志: void flag_set() { global_flag = 1; } void flag_clear() { global_flag = 0; } int flag_isset() { return global_flag; } 因此,线程继续在忙循环中调用do_something() ,并且在一些其他线程设置global_flag的情况下,线程也调用do_something_else() (例如,当通过从另一个线程设置标志来请求时,可以输出进度或调试信息)。 我的问题是: 我是否需要做一些特殊的事情来同步对global_flag的访问? 如果是,那么以便携方式进行同步的最小工作究竟是什么? 我试图通过阅读许多文章来解决这个问题,但我仍然不太确定正确答案……我认为它是以下之一: 答:无需同步,因为设置或清除标志不会产生竞争条件: 我们只需要将标志定义为volatile ,以确保每次检查时都从共享内存中读取它: volatile int global_flag; 它可能不会立即传播到其他CPU核心,但迟早会保证。 B:需要完全同步以确保在线程之间传播对标志的更改: 在一个CPU核心中设置共享标志不一定会让另一个核心看到它。 我们需要使用互斥锁来确保通过使其他CPU上的相应缓存行无效来传播标志更改。 代码如下: volatile int global_flag; pthread_mutex_t flag_mutex; void flag_set() […]

Pthread – time.h :: sleep()和pthread.h :: pthread_yield()之间有什么区别?

我花了很长时间寻找有关time.h :: sleep()和pthread.h :: pthread_yield()之间差异的信息,但无法找到任何可靠的参考资料,所以我发布了这个问题。 time.h :: sleep()和pthread.h :: pthread_yield()有什么区别? 更新: 我问的原因是因为我使用sleep()来睡眠()每个单独的线程……当我有8个线程和4个线程时,我的应用程序开始出现问题。 当我上线查看sleep()是否只影响每个线程时,我找不到任何好的引用来说明Sleep()是否影响整个进程,或者sleep()只影响单个线程。

根据CERT编码规则POS49-C访问共享结构中的相邻成员时的竞争条件?

根据CERT编码规则POS49-C ,访问相同结构的不同字段的不同线程可能会发生冲突。 我使用常规的unsigned int而不是bit-field。 struct multi_threaded_flags { unsigned int flag1; unsigned int flag2; }; struct multi_threaded_flags flags; void thread1(void) { flags.flag1 = 1; } void thread2(void) { flags.flag2 = 2; } 我可以看到,即使是unsigned int,仍然存在竞争条件IF编译器决定使用加载/存储8个字节而不是4个字节。 我认为编译器永远不会这样做,并且竞争条件永远不会发生在这里,但这完全是我的猜测。 是否有关于此案例的明确定义的汇编/编译器文档? 我希望锁定,这是昂贵的,是这种情况恰好未定义的最后手段。 仅供参考,我使用gcc。

为当前运行的线程重用pthread_t变量

我不确定以下代码是否会导致未定义的行为。 //global pthread_t thread1; void *worker(void *arg){ //do stuff } void spawnThread(){ //init stuff int iret1 = pthread_create( &thread1, NULL, worker, (void*) p); } 我的spawnThread将使用全局thread1创建一个新线程。 如果我当前正在运行未完成的线程,在使用thread1变量启动新线程时,是否会以某种方式导致未定义的行为? 如果这是一个问题,将pthread_t变量设置为函数本地是否有意义? 我认为这可能是问题,因为它将使用堆栈,并且一旦我从我的函数返回将被删除。 如果我将pthread_t本地化为函数,我就不能在程序的另一部分使用pthread_join。 规范的解决方案是,使用互斥计数器来跟踪当前运行的线程数量吗? 谢谢