Tag: 互斥

Semaphore与multithreading中的条件变量?

问题 :我必须增加x1和x2变量,这应该由不同的线程完成,并且在两个变量的上一个增量都没有完成之前,不应该调用两个变量的下一个增量。 问题: x1 = 0; x2 = 0; x1++; and x2++; should run parallel on different threads and wait for printing. should print: x1 = 1 and x2 = 1 x1++; and x2++; should run parallel on different threads and wait for printing. should print: x1 = 2 and x2 = 2 x1++; and […]

带线程的C / C ++数组 – 我需要使用互斥锁还是锁?

我是使用线程的新手,并且已经阅读了很多关于如何共享数据和保护数据的信息。 但是我还没有真正掌握何时需要使用互斥锁和锁来保护数据。 以下是我将要解决的问题的描述。 需要注意的重要一点是它对时间至关重要,因此我需要尽可能减少开销。 我有两个固定大小的双arrays。 第一个数组将为后续计算提供数据。 线程将从中读取值,但永远不会被修改。 任何线程都可以在某个时间读取元素。 第二个数组将用于存储计算结果 由线程执行。 此数组的元素只能由一个线程更新,并且可能只在结果值时更新一次 是写的。 我的问题呢? 每次从只读数组访问数据时,是否真的需要在线程中使用互斥锁? 如果是这样你能解释原因吗? 在写入结果数组时,是否需要在线程中使用互斥锁,即使这将是唯一写入此元素的线程? 我应该使用primefaces数据类型吗?如果我这样做会有任何重要的时间吗? 这类问题的答案似乎很多 – 不,如果您的变量是对齐的,则不需要互斥锁。 我的数组元素在这个示例中是否会对齐,或者是否有某种方法可以确保它们是? 代码将在64位linux上实现。 我打算使用Boost库进行multithreading处理。 感谢所有的回复和评论,我一直在仔细研究这个问题并在网上看了好几天,并且一旦发布了答案,并且在几秒钟之内就会有明确的解释。 有一个“已接受的答案”,但所有答案和评论都同样有用。 再次感谢

在这种情况下我真的需要互斥锁吗?

考虑我们有三个线程, bool status_flag[500]数组,以及如下工作情况: 两个线程只在不同索引处写入status_flag数组。 而第三个线程只读取任何索引。 所有三个线程写在不同的索引。 虽然所有三个线程都在读取任何索引。 在写入操作中,我们只是设置标志永远不会重置它。 status_flag [i] = true; 在阅读操作中,我们正在做类似的事情: for(;;){ //spinning to get flag true if(status_flag [i] == true){ //do_something ; break; } } 如果编译器优化(分支预测)代码会发生什么? 我已经阅读了很多关于锁的内容,但仍然对结论结果感到困惑。 请帮我总结一下。

C – 保证condvars已准备好发信号

我有一个简单的应用程序,可以与不同的硬件接口。 对于每个硬件,我针对一个独特的监视器函数生成一个pthread_t ,共有6个线程:1个管理器线程和5个工作线程。 每个线程都有一个通用的初始化例程,它等待管理器线程通过以下方式唤醒它: pthread_mutex_lock(&mMutex); pthread_cond_wait(&mMutex, &condVar); pthread_mutex_lock(&mMutex); 然后主线程通过一次发出一个信号来唤醒所有线程: pthread_cond_wait(&mMutex1, &condVar1); pthread_cond_wait(&mMutex2, &condVar2); … pthread_cond_wait(&mMutex5, &condVar5); 代码实际上工作正常,但这是因为我对时机很幸运。 当主/管理器线程发出pthread_cond_signal ,存在远程但存在的机会,即线程尚未完成初始化。 我需要找到一种方法来保证每个条件变量都有相应的工作线程对它进行了wait调用。 我总是可以创建一个在相应的互斥锁中设置的状态布尔值,但据我所知,我无法在一条指令中primefaces地执行set和wait操作。 我也可以使用pthread_barrier_t ,但这只是保证所有线程在进行各自的wait调用之前都是一个或两个指令。 是否有一种可靠的方法来确定已经进行了wait调用,或者我是否需要采用某种定时等待循环/检查方法? 谢谢。

POSIX C线程。 互斥的例子。 不要按预期工作

我有一个大问题,我无法弄清楚为什么C中的互斥量不能像我期望的那样工作。 这是我的代码: #include #include #include pthread_t mythread; pthread_mutex_t mymutex; void *anotherFunc(void*) { pthread_mutex_lock(&mymutex); for(int i = 0; i < 100; i++) printf("anotherFunc\n"); pthread_mutex_unlock(&mymutex); pthread_exit(NULL); } void *func(void*) { pthread_mutex_lock(&mymutex); for(int i = 0; i < 100; i++) printf("func\n"); pthread_mutex_unlock(&mymutex); pthread_exit(NULL); } int main(int argc, char *argv[]) { pthread_mutex_init(&mymutex, NULL); pthread_create(&mythread, NULL, func, NULL); pthread_create(&mythread, NULL, […]

静态变量和线程(C)

我知道在C中的函数中声明一个静态变量意味着该变量在函数调用之间保留其状态。 在线程的上下文中,这是否会导致变量在多个线程上保持其状态,或者在每个线程之间具有单独的状态? 这是过去的纸质考试问题,我正在努力回答: 以下C函数旨在用于为其调用者分配唯一标识符(UID): get_uid() { static int i = 0; return i++; } 解释get_uid()在multithreading调用它的环境中可能以何种方式正常工作。 使用特定示例方案,详细说明可能发生此类错误行为的原因和方式。 目前我假设每个线程都有一个单独的变量状态,但我不确定这是否正确,或者答案是否与缺少互斥有关。 如果是这种情况,那么在这个例子中如何实现信号量呢?

比较和交换如何工作

我已经阅读了一些post,说比较和交换保证primefaces性,但是我仍然无法得到它是怎么回事。 以下是比较和交换的通用伪代码: int CAS(int *ptr,int oldvalue,int newvalue) { int temp = *ptr; if(*ptr == oldvalue) *ptr = newvalue return temp; } 这如何保证primefaces性? 例如,如果我使用它来实现互斥锁, void lock(int *mutex) { while(!CAS(mutex, 0 , 1)); } 这如何防止2个线程同时获取互斥锁? 任何指针都会非常感激。

这种信号量的实现如何工作?

圣诞快乐! 我正在读“信号量小书” 。 书中有一个C语言的实现,我并不完全理解。 请参阅下面的代码。 有这个唤醒变量。 作者解释说: 唤醒计算未决信号的数量; 也就是说,已被唤醒但尚未恢复执行的线程数。 唤醒的原因是为了确保我们的信号量具有第4.3节中描述的属性3 和 属性3:如果线程执行信号时有线程在等待信号量,则必须唤醒其中一个等待线程。 好的,我想我理解了这个属性的含义。 其中一个等待线程应该获取互斥锁而不是另一个(例如信令线程)。如果我错了,请纠正我。 我不明白的是这个机制如何保证这个属性。 我会说房产不保证。 非等待进程仍然可能获得互斥锁。 我错过了什么? typedef struct { int value, wakeups; Mutex *mutex; Cond *cond; } Semaphore; // SEMAPHORE Semaphore *make_semaphore (int value) { Semaphore *semaphore = check_malloc (sizeof(Semaphore)); semaphore->value = value; semaphore->wakeups = 0; semaphore->mutex = make_mutex (); semaphore->cond = make_cond […]

mutex_unlock是否可用作内存栅栏?

我将描述的情况发生在iPad 4(ARMv7s)上,使用posix libs进行互斥锁定/解锁。 我在其他ARMv7设备上看到过类似的东西(见下文),所以我想任何解决方案都需要更全面地了解ARMv7的互斥锁和内存栅栏的行为。 场景的伪代码: 线程1 – 生成数据: void ProduceFunction() { MutexLock(); int TempProducerIndex = mSharedProducerIndex; // Take a copy of the int member variable for Producers Index mSharedArray[TempProducerIndex++] = NewData; // Copy new Data into array at Temp Index mSharedProducerIndex = TempProducerIndex; // Signal consumer data is ready by assigning new Producer Index to […]

实现文件写入的互斥锁

我试图使用互斥锁来避免多次写入C / Cpp中的同一个线程。 以下是我的程序流程。 我很困惑在哪里包括我的锁和解锁代码。 main() { spawn a worker thread } worker_thread() { read the input file name read some content write the content to the given file name } 我看到的大部分实现似乎都是这样的: main() { pthread_mutex_init(&myMutex;,0); *spawn a worker thread* pthread_join(thread1, 0); pthread_mutex_destroy(&myMutex;); } worker_thread() { read the input file name read some content write the […]