Tag: mutex

发信号通知条件变量(pthreads)

假设某些条件变量“cond”与互斥变量“mutex”相关联。 如果线程在调用pthread_cond_wait(&cond,&mutex)后在cond上hibernate,并且另一个已锁定mutex锁的线程完成,那么该线程在调用pthread_mutex_unlock(&mutex)之前或之后是否调用pthread_cond_signal(&cond)是否重要? 如果调用pthread_cond_signal(&cond) ,它是否甚至需要解锁互斥锁,因为睡眠线程无论如何都会获取互斥锁? 编辑:根据https://computing.llnl.gov/tutorials/pthreads/#ConVarOverview ,“调用pthread_cond_signal()后未能解锁互斥锁可能不允许匹配的pthread_cond_wait()例程完成(它将保持阻塞状态)。 “ 我想那时,解锁,也许只是之后才需要。

自旋锁初始化函数

要在内核v4.19-rc5中初始化自旋锁,必须使用如下定义的spin_lock_init宏: #define spin_lock_init(_lock) \ do { \ spinlock_check(_lock); \ raw_spin_lock_init(&(_lock)->rlock); \ } while (0) 函数spinlock_check(_lock)只返回&lock->rlock 。 本文解释说: spinlock_check的实现非常简单,这个函数只返回给定自旋锁的raw_spinlock_t,以确保我们得到完全正常的原始自旋锁 我不明白这个函数是如何执行检查的 。 我期待ckeck函数中的一些if语句。 对不起,我是内核编程的新手。

pthread_cleanup_push导致语法错误

我尝试在我的代码中添加一个部分,它可以在取消的情况下解锁互斥锁。 这可能会发生并导致死锁。 因此我尝试添加pthread_cleanup_push(cleanup_unlock_mutex, &mutex_ftdi); 但是这行会导致语法错误,我将其添加到代码文件末尾。 如果我注释代码行,程序将编译没有任何错误。 我做错了什么? void cleanup_unlock_mutex(void *p){ pthread_mutex_unlock(p); } ……. }else{ for(unsigned count=0; count <= number_of_requests; count++){ pthread_cleanup_push(cleanup_unlock_mutex, &mutex_ftdi); pthread_mutex_lock(&mutex_ftdi); process_requests(count, numberofthread); pthread_mutex_unlock(&mutex_ftdi); } } // compiler error: error: expected 'while' before '}' token ………. 文件中的所有其他函数都会收到警告:ISO C禁止嵌套函数[-pedantic]。

POSIX线程退出/崩溃/exception崩溃,同时持有互斥锁

是否存在定义明确的POSIX互斥锁所有权行为 线程退出 线程崩溃 线程因exception而崩溃 假设thread-1拥有一个互斥锁。 并且线程2正在等待获取相同的互斥锁。 并且线程1进入1/2/3场景。 对thread-2有什么影响? PS:我认为自旋锁的行为是,不要解除阻塞线程2,并推断受自旋锁保护的部分无论如何都是坏的形状。

如何使用pthread_mutex_trylock?

使用trylock: FILE *fp; pthread_mutex_t demoMutex; void * printHello (void* threadId) { pthread_mutex_trylock (&demoMutex); pthread_t writeToFile = pthread_self (); unsigned short iterate; for (iterate = 0; iterate < 10000; iterate++) { fprintf (fp, " %d ", iterate, 4); fprintf (fp, " %lu ", writeToFile, sizeof (pthread_t)); fprintf (fp, "\n", writeToFile, 1); } pthread_mutex_unlock (&demoMutex); pthread_exit (NULL); […]

静态pthreads互斥初始化

使用pthreads,如何在C中初始化一个静态的互斥量数组? 对于单个静态互斥锁,似乎我可以使用PTHREAD_MUTEX_INITIALIZER。 但是它们的静态数组呢? 例如,在 #include #define NUM_THREADS 5 / *初始化静态互斥arrays* / static pthread_mutex_t互斥锁[NUM_THREADS] = …? 或者必须动态分配?

C pthread mutex:`{‘之前的预期表达式

我正在使用pthread库来创建两个线程。 我使用两个队列来传递两个线程(生产者 – 消费者)之间的数据,因此希望有一个互斥体来同步线程中队列中的push-pops。 但我得到一个编译错误如下: $ gcc simple-tun.c simple-tun -lpthread simple-tun.c: In function ‘new_queue’: simple-tun.c:920:13: error: expected expression before ‘{‘ token 我得到错误的函数是: 908 struct queue * new_queue () { 909 910 struct queue * q; 911 q = (struct queue *) malloc (sizeof(struct queue)); 912 913 if (q == NULL) 914 return NULL; 915 916 […]

什么样的循环(;;)?

在torvalds / linux-2.6.git中找到 – > kernel / mutex.c第171行 我试图在谷歌上找到它,但无济于事。 for (;;)指示什么?

并行合并使用线程排序/比Seq更多/更慢。 合并排序。 救命

http://pastebin.com/YMS4ehRj 这是我对并行合并排序的实现。 基本上我所做的是,对于每一次拆分,前半部分由一个线程处理,而后半部分是顺序的(即)说我们有一个包含9个元素的数组,[0..4]由线程1处理,[0 ..1]处理线程2,[5..6]由线程3处理(查看源代码以便澄清)。 其他一切都保持不变,比如合并。 但问题是,这比合并排序慢得多,甚至比正常的冒泡排序慢! 我的意思是一个25000 int的数组。 我不确定瓶颈在哪里:它是互斥锁吗? 是合并吗? 关于如何加快速度的任何想法?

可以用变量体定义类似函数的宏吗?

我一直在寻找用于定义宏的GCC文档 ,它看起来像我想要的是不可能的,但我想如果是的话,这里有人会知道。 我想要做的是定义这个宏: synchronized(x) { do_thing(); } 其中扩展为: { pthread_mutex_lock(&x); do_thing(); pthread_mutex_unlock(&x); } 在C ++中,我可以创建一个SynchronizedBlock对象,在其构造函数中获取锁定并在析构函数中解锁,但我不知道如何在C中执行此操作。 我意识到我可以使用synchronized(x, &myfunction);forms的函数指针synchronized(x, &myfunction); ,但我的目标是使一些C代码看起来尽可能像Java。 是的,我知道这是邪恶的。