Tag: 异步

读/写器伪代码中竞争条件的可能性

我正在分析以下关于竞争条件的伪代码(一些自我练习)并查看可能性的位置。 伪代码描述了一个模糊的异步读写器。 作家线程 r = 0; w = 1; l = 2; //assign start slot numbers while(1) { write_slot(w); l = w; //last written slot is ww = not(r,l) //assigns next slot so that w is neither r or l } 读者主题 while(1) { r = l; //read from latest write read(r); } 到目前为止我发现的腐败/竞争条件的可能性是,如果变量读/写不是primefaces的,那么,例如,当读者读到它时,作者可以改变l的值(可能导致通过撕裂读/写的无意义的r值)。 是否有任何竞争条件可能导致读者和作者试图访问同一个插槽?

如何使用Gnome GIO以非阻塞方式通过块读取文件?

什么是以非阻塞方式和chunk-by-chunk处理GInputStream的正确方法(GIO / Glib / GTK / Gnome)? 我有一个应用程序正在下载(通过libsoup)并以块的forms处理数据流并并行执行其他操作。 我在g_input_stream_read_async上调用g_input_stream_read_async (从soup_session_send_finish接收并给它一个合理大小的块来读取(在我的情况下为2048字节)。 收到g_input_stream_read_async回调后,我想继续读取字节。 因此,第一个想法是从回调处理程序递归调用g_input_stream_read_async ,将其自身作为下一个回调传递。 但这对我来说似乎很笨拙而且不太正确(而且我不确定将目前仍在执行的回调传递给GIO是否安全)。 替代方案可能是分离线程并在调用g_input_stream_read的循环中执行常规的阻塞读取。 但是它通常是如何在GTK / Gnome世界中完成的? 什么是正确的方法? 任何简单的工作示例(最好是与GTK / Gnome相关的开发人员)都将受到赞赏。

同步写入使用FILE_FLAG_OVERLAPPED打开的文件

我已经打开了一个文件 HANDLE handle= CreateFileW( fileName, GENERIC_READ | GENERIC_WRITE, 0, NULL, OPEN_EXISTING, FILE_FLAG_OVERLAPPED, NULL); 然后,文件句柄用于异步读取操作: ReadFile(handle, buffer, 1, NULL, &overlapped); 这很有效。 但是,我现在想要进行同步写入。 WriteFile文档说明了这一点 如果使用FILE_FLAG_OVERLAPPED打开hFile,则以下条件有效: •lpOverlapped参数必须指向有效且唯一的OVERLAPPED结构,否则该函数可能会错误地报告写操作已完成。 省略lpOverlapepd参数时, GetLastError()返回ERROR_INVALID_PARAMETER 。 打开两个句柄,一个用于读取,一个用于写入也不起作用,因为第二个句柄产生ERROR_ACCESS_DENIED错误。 如何打开异步读取和同步写入的文件? 我不想不必要地增加代码复杂性。

pthread_join()用于异步线程

我编写了一个简单的演示程序,以便我可以理解pthread_join()函数。 我知道如何使用pthread_condition_wait()函数来允许异步线程,但我正在尝试理解如何使用pthread_join()函数执行类似的工作。 在下面的程序中,我将Thread 1s ID传递给Thread 2s函数。 在Thread 2s函数中,我调用pthread_join()函数并传入Thread 1s ID。 我希望这会导致线程1首先运行,然后线程2运行第二,但我得到的是它们都同时运行。 这是因为一次只有一个线程可以使用pthread_join()函数,并且当我从主线程调用它时我已经在使用pthread_join()函数了吗? #include #include #include void *functionCount1(); void *functionCount2(void*); int main() { /* How to Compile gcc -c foo gcc -pthread -o foo foo.o */ printf(“\n\n”); int rc; pthread_t thread1, thread2; /* Create two thread –I took out error checking for clarity*/ pthread_create( &thread1, NULL, […]

linux上使用rtkaio的aio_write有时很长

我在linux上使用async io和rtkaio库。 在我的测试中,一切都很完美,但是,在我的实际应用程序中,我看到aio_write应该返回非常快,非常慢。 将128KB写入O_DIRECT填充文件可能需要100多毫安。 我的测试和应用程序使用相同的I / O大小,我检查相同的文件系统(GFS)。 我添加了计数,我发现有大约50%的异步io操作是短的(短于2毫米)和50%的长(超过2毫米)。 我还检查了测试和应用程序都使用相同的rtkaio库。 我很丢失,任何想法我应该在哪里看? 另一个我的相关问题: / proc / sys / fs / aio-nr永远不会高于1024(Linux上的AIO)

使用libevent进行异步Redis池化

我想尽可能多地从Redis + Hiredis + libevent获得。 我正在使用以下代码(没有任何检查是简短的) #include #include #include #include #include #include #include typedef struct reqData { struct evhttp_request* req; struct evbuffer* buf; } reqData; struct event_base* base; redisAsyncContext* c; void get_cb(redisAsyncContext* context, void* r, void* data) { redisReply* reply = r; struct reqData* rd = data; evbuffer_add_printf(rd->buf, “%s”, reply->str); evhttp_send_reply(rd->req, HTTP_OK, NULL, rd->buf); evbuffer_free(rd->buf); […]

为WinSocks和* nix创建一个非阻塞套接字

在C / C ++中,如何将阻塞套接字转换为WinSocks和* nix中的非阻塞套接字; 这样select()才能正常工作。 您可以将预处理器用于特定于平台的代码。

读取/预制系统调用的线程安全性

我在multithreading环境中几乎没有与read()/ pread()系统调用相关的查询 我正在使用基于freeBsd的Mac-OSX,如果这有助于我在读模式下只使用这个文件,而不是读/写而且语言是c / c ++ 假设我们在磁盘AAAABBBBCCCCDDDEEEE上有一个文件…. 和4个字母适合文件的一页 所以Page1:AAAA 第2页:BBBB …..等等 现在我从具有相同文件描述符的两个不同线程发起读取系统调用,我的意图是从线程1读取第一页,从线程2读取第二页,等等。 阅读(FD,浅黄色,的sizeof(页)); 从手册页我明白,读取也会增加文件指针,所以我肯定会得到像#的乱码 ABCC ABBB ..等(没有特别的顺序) 解决这个问题我可以使用pread() “Pread()执行相同的function,但是从文件中的指定位置读取而不修改文件指针”//来自手册页 但我不确定使用pread是否真的会帮助我实现目标,因为即使它没有增加内部文件指针,也无法保证响应不会混乱。 我的所有数据都是页面对齐的,我想从每个线程中读取一页 线程1读取:AAAA线程2读取:BBBB线程3读取:CCCC …没有实际拼接内容.. 我还发现一个post一旦write()返回,从文件中读取是否安全? 但它不是很有用。 我也不确定read()是否真的会有问题,我正在考虑。我正在阅读的文件是一个二进制文件,因此我很难快速手动阅读和validation.. 任何帮助将不胜感激

C ++的异步函数调用

我需要一个提示如何在C / C ++中实现异步函数调用(或者用于windows和/或linux的框架/ API调用的名称) 用例如下:父线程调用函数。 该函数创建一个子线程并返回,因此调用是非阻塞的,父线程可以继续做一些工作。 例如,获取结果的pthread_join不合适,因此必须将结果存储在堆中,并且必须通知父级。 我想要的是像父线程中的回调函数,它将在子线程准备好作业后执行。 这是令人惊讶的,但我在谷歌找不到一个例子。 感谢帮助

异步Mysql连接器

是否存在可以在C或C ++应用程序中使用的Mysql的任何异步连接器? 我正在寻找可以插入用Boost.Asio编写的反应器模式的东西。 [编辑:]在线程中运行同步连接器不是一个选项。