Tag: 并发

ncurses,print和contemporary获取字符串

用C编写的程序使用ncurses 。 while循环用于连续检查队列中是否有新消息到达:如果是,则消息将打印在屏幕上,然后从队列中删除: while (condition) { if (queue_not_empty) { printw(element_from_queue); refresh(); remove(element_from_queue); } } 但是,同时程序应该能够从用户获取输入字符串,然后通过scanw将其存储在数组char message[100] 。 但是,如果我把 while (condition) { if (queue_not_empty) { printw(element_from_queue); refresh(); remove(element_from_queue); } scanw(message); } 循环将停止,直到用户没有键入字符串,程序将仅在用户输入后打印队列的新消息。 它应该不是这样的! 队列消息可以随时到达,应该打印; 用户消息可以随时到达,并应存储到数组中。 我想避免创建另一个线程,因为ncurses对多个线程变得奇怪。 无论如何,我需要两个“当代”循环,一个用于打印消息,一个用于读取用户输入。 可能有解决方案吗? 换句话说:是否可以使用ncurses打印一些输出并从同一个屏幕中的同一个线程中的用户输入一些多个字符 ?

使用fork()和IPC在C中进行最有效的矩阵乘法

我需要使用多个进程在C中实现并发矩阵乘法。 我理解,因为每个进程都有自己的私有地址空间,我将不得不使用某种forms的进程间通信(IPC)。 我做了一些环顾四周,找不到许多不使用线程的实现。 我想知道是否有人知道最好的方法,使用共享内存,消息传递或管道? 我不是要求解决方案,而是,如果有人知道,这些方法中的哪一种在矩阵乘法中会更有效。 或者,如果有一个通用的标准方法来执行多个流程?

在Linux中修改子进程的全局变量

我来自C#背景,我在C中的并发性有点困难。我不会骗你…这是我必须为学校做的项目的一部分。 虽然我从事过高级语言的专业工作,但是我的高级论文教授把我们推到了公共汽车下面,强迫整个class级用C编码(我们大多数人都没有经验…… :()。 无论哪种情况,回到问题。 我有一个全局整数变量(从0开始),需要同时增加5个进程,直到它达到100(相当于100%)。 基本上发生的事情是,不是单独修改completionCounter而是每个子进程正在复制它… 是否存在lock(object)或C#中可用的类型? 我尝试使用二进制信号量,但我无法让它工作,我还没有使用共享内存。 const int THREADCOUNT = 5; int completionCounter = 0; int main(int argc, char **argv) { int count = 0; pid_t pid; for(count = 0; count<THREADCOUNT; count++) { if( (pid = fork()) < 0 ) { //error… return -1; } else if( pid == 0 ) { //child; […]

在没有锁定的x86机器上读/写一个int

假设在C程序中,我有一个在32位机器上运行的P线程,以及int MAX一个共享的32位整数 每个线程都可以读/写MAX。 要求:线程读取的值不应该被破坏,例如,前16位和后16位不同步 问题:我是否需要锁来保护读写? 或者我可以安全地忽略锁定,因为保证LOAD / SAVE汇编指令primefaces地发生吗?

创建多个线程后Pthread_create失败

我正在开发一个处理客户端连接的应用程序。 我正在为每个请求生成一个线程,因为会有短任务。 但是,在处理一定数量的连接后,我一直遇到问题。 具体来说,在381个连接之后,pthread_create无法创建新线程。 我知道如果应用程序资源耗尽,或者已经创建了超过PTHREAD_THREADS_MAX个线程,这可能会失败。 奇怪的是,当发生此错误时,前381个线程已经停止。 我没有使用pthread_join来等待这些线程停止,我相信pthreads不要求我以某种方式“停止”线程,如果我错了就纠正我(至少manpage没有提到这个)。 我想也许这可能是在同时产生多个线程时产生的,但是,我已经多次测试过,每次第382个线程创建都失败了。 有谁知道会发生什么? 任何帮助将不胜感激。 提前致谢。

并发访问和没有数据结构

问题是这样的: 我有一个500指针的数组,指向双链表中的500个元素。 有10个线程并行运行。 每个线程运行50个循环,并尝试释放列表中的某些元素。 列表已排序(包含简单整数),并且还有10个其他线程并行运行,搜索包含特定整数的节点并访问此节点中的其他卫星数据。 所以节点就像: struct node { int key; // Key used to search this nodes int x,y,z; // Satellite data struct node *prev; struct node *right; }; 如果我只是在搜索/删除之前锁定列表,则问题很容易解决。 但这太粗糙了。 我如何同步这些线程,以便我可以实现更好的并发? 编辑: 这不是一个家庭作业问题。 我不属于学术界。 持有500个指针的数组看起来很奇怪。 我已经做到了这样,以尽可能少的复杂性来形象化我的问题。

C中的重入和重入?

我正在读一本名为Linux System Programming的书。 引用本书: 那么系统调用和其他库函数呢? 如果您的进程正在写入文件或分配内存,并且信号处理程序写入同一文件或调用malloc(),该怎么办? 有些function显然不可重入。 如果一个程序正在执行一个非重入函数并且发生信号并且信号处理程序然后调用相同的非重合函数,则可能发生混乱。 但接下来会: 保证重入函数 保证可以安全重入的function用于信号 一些function在这里.. 写() 一些function在这里.. 我很困惑,是write()可重入,还是不可以? 因为我认为它与声明冲突: 如果您的进程正在写入文件,该怎么办?

尝试在c中实现并发TCP服务器和客户端

我已经使用线程和分支在c中实现了TCp并发服务器和客户端。 但我没有办法检查是否有任何其他标准方法来实现这一点。 我已经为标准编码的东西搞砸了,但没有找到任何有用的东西。 有人可以共享一些好的链接或代码,这样我就可以有一个标准的实现并发服务器的想法。 感谢帮助

是在线程安全的不同字节范围读取和写入同一文件?

我有一个名为“data.txt”的文件,总是有50个字节的数据。 我有两个主题。 第一个线程,从字节0到字节50读取内容: while(1){ char buf[50]; FILE* fp = fopen(“data.txt”,”r”); fread(buf,1,50,fp); /* process data */ fclose(fp); } 第二个线程,将数据附加到文件(=始终在前50个字节之后): while(1){ FILE* fp = fopen(“data.txt”,”a”); fwrite(“hello\n”,1,6,fp); fclose(fp); } 这个解决方案是线程安全且可移植的吗? (没有分段错误,没有数据不一致,……)

如何在C中同时运行两个子进程?

所以我进入并发编程,但由于某种原因我甚至无法使用基础知识。 我有一个名为fork.c的文件,其中包含一个方法main。 在这个方法主要我分叉两次,进入子进程1和2。 在孩子1中,我打印了’A’字符50次。 在孩子2中,我打印字符’B’50次。 当我运行我的代码时,我得到输出AAAAA … AAAABBBBBB …. BBBBBB。 但从来没有像ABABABABABABAB那样….事实上,有时我甚至得到了BBBBB …… BBBBAAAA …… AAAAA。 那么为什么我会遇到这种行为? 也许我完全错了。 #include #include void my_char(char n) { write(1, &n, 1); } int main() { int status; pid_t child1, child2; if (!(child1 = fork())) { // first childi int a; for (a = 0; a < 50; a++) { my_char('A'); […]