Tag: pthreads

检查pthread互斥锁是锁定还是解锁(线程锁定后)

我需要查看一个互斥锁是否在if语句中被锁定或解锁,所以我这样检查它… if(mutex[id] != 2){ /* do stuff */ } 但当我检查它时,gcc给我以下错误: error: invalid operands to binary != (have ‘ptherad_mutex_t’ and ‘int’) 那么如何检查互斥锁是否被锁定? 编辑: 我的问题的一个关键组成部分是我的线程(按设计)在将控制传递给另一个线程后立即锁定自己。 因此,当线程A将控制传递给线程B时,线程A被锁定,线程B执行某些操作,然后当线程B完成时,它将解锁线程A. 这样做的问题是,如果线程B尝试解锁线程A并且线程A尚未完成锁定,则解锁的调用将丢失,线程A保持锁定状态,从而导致死锁。 更新: 我根据caf的建议重新制作了我的程序,但我仍遇到问题。 我已经将我的程序模拟到了尽可能最好的结构caf中,但我现在甚至无法分辨出导致死锁的原因……我在这里创建了一个新问题,寻求我的代码帮助。 以下是caf的建议的可运行版本。 我在线程a的函数中做了一个小的重新排序,没有它,线程a和线程b都会在创建时被锁定,等待一个永远不会改变的条件。 #include int run_a = 0; pthread_mutex_t lock_a = PTHREAD_MUTEX_INITIALIZER; pthread_cond_t cond_a = PTHREAD_COND_INITIALIZER; int run_b = 0; pthread_mutex_t lock_b = PTHREAD_MUTEX_INITIALIZER; pthread_cond_t cond_b = PTHREAD_COND_INITIALIZER; […]

pthread_mutex_lock是否包含内存栅栏指令?

pthread_mutex_lock和pthread_mutex_unlock函数是否调用内存栅栏/屏障指令? 或者像compare_and_swap暗示那样的低级指令是否有内存障碍?

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

我正在开发一个我做multithreading的应用程序。 我的一个工作线程在窗口小部件上显示图像。 另一个线程播放声音。 我想在按钮单击事件上停止/暂停/暂停/hibernate线程。 和点击video播放器播放/暂停按钮时相同。 我正在使用pthread库进行线程化在linux平台上用c ++开发我的应用程序。 有人能告诉我如何实现线程暂停/挂起吗?

pthread同步阻塞队列

我正在寻找使用pthread同步语义在C中建议的线程安全阻塞队列(多生产者/消费者)的实现。

非阻塞pthread_join

我正在对multithreading服务器的关闭进行编码。如果一切顺利,所有线程都应该自行退出,但是线程卡住的可能性很小。在这种情况下,使用非阻塞连接会很方便所以我能做到。 有没有办法做一个非阻塞的pthread_join? 某种定时加入也会很好。 像这样的东西: foreach线程 nb_pthread_join(); 如果还在运行 pthread_cancel可以(); 我可以考虑更多的情况,其中一个非bloking连接将是有用的。 因为似乎没有这样的function所以我已经编写了一个解决方法,但它并不像我想的那么简单。

pthread_create并传递一个整数作为最后一个参数

我有以下function: void *foo(void *i) { int a = (int) i; } int main() { pthread_t thread; int i; pthread_create(&thread, 0, foo, (void *) i); } 在编译时,有一些关于强制转换的错误( (void *) i和int a = (int) i )。 如何正确传递整数作为pthread_create的最后一个参数?

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

我在同一个进程中有关于主线程和其他线程的问题。 当主函数返回时,其他线程也退出? 我有些困惑。 我写了一些测试代码,如下所示: 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传递整数值

我只是想将一个整数的值传递给一个线程。 我怎样才能做到这一点? 我试过了: int i; pthread_t thread_tid[10]; for(i=0; i<10; i++) { pthread_create(&thread_tid[i], NULL, collector, i); } 线程方法如下所示: void *collector( void *arg) { int a = (int) arg; … 我收到以下警告: warning: cast from pointer to integer of different size [-Wpointer-to-int-cast]

accept()线程安全吗?

我正在用C编写一个简单的网络服务器,用于我正在做的课程。 一个要求是我们实现一个线程池来处理使用pthreads的连接。 我知道我将如何大致这样做(在主线程中调用accept并将文件描述符传递给freee线程),但是我的朋友提出了一种替代方法而不是我想到的方法:在前面创建我的所有线程,让他们全部循环接受电话。 接受的想法是阻塞所有空闲线程,当连接进入时,只给出一个文件描述符。 然后当一个给定的线程完成一个连接时,它会循环回来并阻塞一个再次接受的调用。 使用accept()作为信号量的调用。 这样可以简化实现,因为您不需要跟踪哪些线程正忙,哪些线程已准备好进行连接。 理论上它也会降低延迟,因为线程可以立即开始执行。 我的问题是,这样安全吗? 我打算实施它并尝试一下,但我还没准备好,我很想知道答案。 我在谷歌和这里搜索stackoverflow,但找不到任何人这样做。 接受线程安全吗? 我假设这种方法会有更多的开销,因为你一直在运行所有的线程,这两种方法只是一个简单的内存/延迟权衡吗? 编辑:我不确定这应该是社区维基,如果它应该是道歉,我找不到按钮:P

pthreads中的信号处理

我创建了一个pthread,并在其中安装了一个信号处理程序,与main( )函数中的方式相同。 线程的信号处理程序是一个单独的函数。 令人惊讶的是,它不起作用,即线程的信号处理程序无法捕获信号。 这是代码: #include #include #include #include #include typedef struct data { char name[10]; int age; }data; void sig_func(int sig) { printf(“Caught signal: %d\n”,sig); signal(SIGSEGV,sig_func); } void func(data *p) { printf(“This is from thread function\n”); signal(SIGSEGV,sig_func); // Register signal handler inside thread strcpy(p->name,”Mr. Linux”); p->age=30; sleep(2); // Sleep to catch the signal } […]