Tag: 同步

同步和异步通信如何正常工作

我试图理解术语同步和异步通信,但我有点困惑。 我试图深入研究这一点,但仍然存在混淆。 我的问题如下: 1.同步和异步通信如何工作? 还参考上面提到的用于异步通信的信号是什么。 2.同步和异步过程如何工作? 任何说明这一点的例子都会有所帮助。 如果这是一个非常简单的问题,请道歉。 我是编程新手。 希望你的答案能帮助我。 提前致谢!!!!

不使用C语言中的semapore进行数据同步

我需要在我的代码中进行数据同步。 目前我正在访问中断内部的全局值以及本地函数,如果中断调用频繁,可能会破坏数据。 我需要避免这种情况。 我没有在我的代码中使用操作系统,所以我不能使用信号量。 使用类似于信号量的锁定方法可能会解决我的问题。 任何帮助,将不胜感激

为什么__sync_add_and_fetch适用于32位系统上的64位变量?

请考虑以下压缩代码: /* Compile: gcc -pthread -m32 -ansi xc */ #include #include #include static volatile uint64_t v = 0; void *func (void *x) { __sync_add_and_fetch (&v, 1); return x; } int main (void) { pthread_t t; pthread_create (&t, NULL, func, NULL); pthread_join (t, NULL); printf (“v = %”PRIu64″\n”, v); return 0; } 我有一个uint64_t变量,我想以primefaces方式递增,因为该变量是multithreading程序中的计数器。 为了达到primefaces性,我使用了GCC的primefaces内核 。 如果我编译amd64系统(-m64),生成的汇编代码很容易理解。 […]

CUDA:if语句中的__syncthreads()

我有一个关于CUDA同步的问题。 特别是,我需要对if语句中的同步进行一些澄清。 我的意思是,如果我将__syncthreads()放在if语句的范围内,该块语句被块内的一小部分线程击中,会发生什么? 我认为一些线程将“永远”等待其他线程不会达到同步点。 所以,我编写并执行了一些示例代码来检查: __global__ void kernel(float* vett, int n) { int index = blockIdx.x*blockDim.x + threadIdx.x; int gridSize = blockDim.x*gridDim.x; while( index < n ) { vett[index] = 2; if(threadIdx.x < 10) { vett[index] = 100; __syncthreads(); } __syncthreads(); index += gridSize; } } 令人惊讶的是,我观察到输出非常“正常”(64个元素,块大小为32): 100 100 100 100 100 100 100 100 […]

互斥是否需要在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() […]

如何使用仅手动同步到磁盘的mmap来获取检查点文件

我需要以最快的方式定期将文件与内存同步。 我想我想要的是有一个mmap’d文件,它只能手动同步到磁盘。 我不确定如何防止任何自动同步发生。 除非我手动指定,否则无法修改该文件。 关键是要有一个检查点文件,它将状态的快照保存在内存中。 我想尽可能避免复制,因为这需要相当频繁地调用,速度很重要。

修改数组中的一个元素而另一个线程修改同一数组的另一个元素时,它是定义良好的行为吗?

给定一个类型为foo_t[n]的数组和一组n个线程,其中n个线程中的每个线程都读取并修改数组的不同元素,我是否需要显式同步数组的修改,或者我可以假设同时修改成员数组是明确定义的行为? 它有多大foo_t /它的对齐方式有关系吗?

确定要复制CRITICAL_SECTION?

可以使用CRITICAL_SECTION变量来实现互斥。 我的问题是:CRITICAL_SECTION是否支持复制? 如果我将一个值传递给另一个线程,我是否可以确定相互排除是否有效? 如果答案是“你不能那样做”,我不会感到惊讶,但是得到某种官方确认会很好。 我无法在文档中找到任何声明。

等待文件可用于使用Win32进行读取

我正在通过同步调用ReadDirectoryChangesW观看目录。 当一个新文件可用时,我尝试使用GENERIC_READ和FILE_SHARE_READ CreateFile立即访问它,但这给了我ERROR_SHARING_VIOLATION 。 将文件放入监视目录的过程在我尝试读取它时没有完成写入。 有没有办法可靠地等到文件可供阅读? 我可以将方法放入如下所示的循环中,但我希望有更好的方法。 while ((hFile = CreateFile (path, GENERIC_READ, FILE_SHARE_READ, NULL, OPEN_EXISTING, 0, NULL)) == INVALID_HANDLE_VALUE) { if (GetLastError() == ERROR_SHARING_VIOLATION) Sleep (500); else break; // some other error occurred } if (hFile == INVALID_HANDLE_VALUE) { // deal with other error return 0; } ReadFile (…);

使用两个线程在C / C ++中操作不同的数组索引时,是否需要同步?

假设我有一个如下定义的数组: volatile char v[2]; 我有两个线程(分别用A,B表示)操纵数组v 。 如果我确保A,B在任何时候使用不同的索引,也就是说,如果A现在正在操纵v[i] ,那么B要么什么都不做,要么操纵v[1-i] 。 我想知道这种情况需要同步吗? 我已经提到了这个问题 ,但我认为它在Java中是有限的。 我之所以提出这个问题的原因是,我在一个大型项目中一直在努力解决一个奇怪而罕见的错误,直到现在,我能解释这个错误的唯一原因是需要同步以上操纵。 (由于这个bug非常罕见,我很难certificate我的推测是否属实) 编辑:对于v ,可以进行读取和修改。