Tag: 同步

共享内存中进程间的障碍实现

我正在寻找一个进程间障碍实现。 进程在共享内存中(即在同一个ndoe上)。 进程是MPI进程。 我不想使用MPI_Barrier函数,因为所有MPI实现的一般策略都是主动等待。 只要他们等待,我希望我的进程保持睡眠状态。 限制: 应该在C中,也许在C ++中 没有自旋锁,所以它可以使用信号量 linux OS 我相信它存在数千个屏障实现,但我没有找到任何?! 谢谢

Pthread同步:两个文本文件的返回和读取

我正在编写一个创建两个线程的程序。 每个线程负责读取一个文本文件,每行有一个字符。 第一种格式如下: h 0 h 0 … 第二个格式如下: 0 i 0 i 0 i 有时可能会有多个字母在彼此之后,或者在彼此之后有多个零。 但是,可以肯定的是,如果一个文件的一行上有一个字母,则第二个文件的相应行将为0,反之亦然。 线程应该继续将文件输入读入全局char数组,直到它们达到零。 此时,他们允许其他线程接管。 他们一直来回走,直到两个文件完全被读取。 在这一点上,当我跑步的时候,我得到的变化是:(1)很多h后跟很多我或(2)( 正确答案 )连续的hihihi流,或者(3)有时很多我跟着很多h。 所以,我知道我的同步方法已关闭。 这是我的一个线程的示例:(注意两个线程完全相同,除了正在打开的文件。) void *getMessage1() { FILE *studentOne = fopen(“Student1”, “r”); size_t howManyChars; char *placeHolderChars; int count = 1; while (count 0) { placeHolderChars[1] = ‘\0’; } strcat(message,placeHolderChars); } free(placeHolderChars); if(feof(studentOne)) { pthread_mutex_unlock(&lock); […]

可以在没有硬件支持的软件中实现测试和设置吗?

这是用软件编写的测试和设置: boolean TestAndSet(boolean *target) { boolean rv = *target; *target = TRUE; return rv; } 和 do { while(TestAndSetLock(&lock)) ; // do nothing // critical section lock = FALSE; // remainder section } while(TRUE); 我们可以在CPU中使用不支持硬件级别的测试和设置的机制吗? 如果是这样,primefaces性如何得到保证?

InterlockedIncrement vs InterlockedIncrementAcquire / Release(Redux)

这是这个问题的后续问题 : 我想我不理解Interlocked Acquire / Release API。 我把下面的小程序放在一起。 据我了解,g_val_1,g_val_2和g_val_3应始终以相同的顺序更新,并且最终应该以相同的值结束。 但他们没有(对于多个线程)。 我错过了什么? 谢谢。 #include “windows.h” #include “stdio.h” #define _THREADS_ 100 #define _TICKS_ 1000 int volatile g_threads = 0; DWORD volatile g_val_1 = 0; DWORD volatile g_val_2 = 0; DWORD volatile g_val_3 = 0; BOOL g_running = TRUE; DWORD TestThread(PVOID ignore) { while (g_running) { InterlockedIncrementAcquire(&g_val_1); g_val_2++; […]

如何保护基于C的库的init函数?

我已经编写了一个基于C的库,并且它可以并行地在multithreading中工作,我在init函数中创建了一些全局互斥。 我希望在multithreading中使用库API之前,可以在主线程中调用init函数。 但是,如果直接在multithreading中调用init函数本身,那么这是一个问题。 有没有办法保护我的库中的init函数本身? 我能想到的一种方法是让应用程序创建一个互斥锁并保护对我的init函数的并行调用,但是我可以保护它免受我的库本身的影响吗?

Pthread条件信号 – 未按预期工作

我正在研究一个项目,并尝试使用pthread_cond_wait()和pthread_cond_signal()来同步两个线程。 我的代码看起来像这样: pthread_mutex_t lock_it = PTHREAD_MUTEX_INITIALIZER; pthread_cond_t write_it = PTHREAD_COND_INITIALIZER; int main(int argc, char**argv) { pthread_t t_send_segments, t_recv_acks; pthread_create(&t_send_segments, NULL, send_segments, (void*)NULL); pthread_create(&t_recv_acks, NULL, recv_acks, (void*)NULL); pthread_join(t_recv_acks, (void**)NULL); pthread_mutex_destroy(&lock_it); pthread_cond_destroy(&write_it); } void* send_segments(void *v) { for(;;) { pthread_mutex_lock(&lock_it); printf(“s1\n”); printf(“s2\n”); pthread_cond_wait(&write_it, &lock_it); printf(“s3\n”); printf(“s4\n”); printf(“s5\n”); pthread_mutex_unlock(&lock_it); } return 0; } void* recv_acks(void *v) { for(;;) […]

强制执行C语句的顺序?

我遇到了MS C编译器重新排序某些语句的问题,这些语句在multithreading上下文中非常重要,并且处于高优化级别。 我想知道如何在特定的地方强制订购,同时仍然使用高水平的优化。 (在低优化级别,此编译器不重新排序语句) 以下代码: ChunkT* plog2sizeChunk=… SET_BUSY(plog2sizeChunk->pPoolAndBusyFlag); // set “busy” bit on this chunk of storage x = plog2sizeChunk->pNext; 产生这个: 0040130F 8B 5A 08 mov ebx,dword ptr [edx+8] 00401312 83 22 FE and dword ptr [edx],0FFFFFFFEh 其中pPoolAndBusyFlag的写入由编译器重新排序,在pNext fetch 之后发生。 SET_BUSY本质上是 plog2sizeChunk->pPoolAndBusyFlag&=0xFFFFFFFeh; 我认为编译器已经正确地决定重新排序这些访问是正确的,因为它们是同一结构的两个独立成员,并且这种重新排序对单线程执行的结果没有影响: typedef struct chunk_tag{ unsigned pPoolAndBusyFlag; // Contains pointer to owning pool and […]

同步对双向链表的访问

我正在尝试在pthreads环境中在C中实现一个(特殊类型的)双向链表,但是只使用C-wrapped同步指令,如primefacesCAS等,而不是pthread原语。 (列表的元素是固定大小的内存块,几乎肯定不能适合pthread_mutex_t等。)我实际上并不需要完全任意的双向链表方法,只有: 插入列表末尾 从列表的开头删除 基于指向要删除的成员的指针删除列表中的任意点,该指针是从遍历列表之外的源获得的。 因此,描述此数据结构的更好方法可能是队列/ fifo,可以删除队列中的项目。 是否有标准方法来同步这个? 我陷入了可能的死锁问题,其中一些问题可能是所涉及的算法所固有的,而其他问题可能源于这样一个事实,即我正试图在一个有限的空间内工作,并对我能做的事情有其他限制。 编辑 :特别是,如果要同时删除相邻的对象,我会坚持做什么。 大概在删除对象时,您需要获取列表中上一个和下一个对象的锁定,并更新它们的下一个/上一个指针以指向彼此。 但是如果任何一个邻居已经被锁定,这将导致死锁。 我试图找出一种方法,任何/所有发生的删除可以走在列表的锁定部分,并确定当前正在删除过程中的最大子列表,然后锁定该子列表旁边的节点,以便整个子列表整体被删除,但我的头开始受伤.. 😛 结论(?) :为了跟进,我确实有一些我想要工作的代码,但我也对理论问题感兴趣。 每个人的答案都非常有用,并结合我在此处表达的限制之外的细节(你真的不想知道指向要移除的元素的来源和所涉及的同步!)我现在决定放弃本地锁定代码并专注于: 使用大量较小的列表,每个列表都有单独的锁。 在获取锁定之前,最小化锁定所持有的指令数量并以内存(以安全的方式)戳戳,以减少在保持锁定时页面错误和缓存未命中的可能性。 测量人为负荷下的争用并评估这种方法是否令人满意。 再次感谢所有给出答案的人。 如果我的实验不顺利,我可能会回到所概述的方法(特别是弗拉德),然后再试一次。

设置协调算法的实现

我正在寻找集合协调算法的实现。 问题在于:有两个集合,其中元素由位于不同机器上的一些相对紧凑的值(例如UUID或MD5 / SHA1 /任何散列)标识。 这些集合在相对较少的元素中有所不同,我希望在传输最少量的数据时同步这些集合。 大多数谷歌搜索引领这里 。 这是GPL实施的似乎是最先进的任务方法。 问题是我不能在我的应用程序中使用GPL代码。 我很可能必须使用像nzmath这样的东西重新实现它,但也许还有其他实现(最好是Python或C / C ++),或者还有其他更好的算法?

实现文件写入的互斥锁

我试图使用互斥锁来避免多次写入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 […]