Tag: multithreading

Linux / Unix中的futex是否有任何等价物?

我在C / C ++中寻找可用于轮询的东西(如select , kqueue , epoll即不繁忙的轮询 )。 换句话说,我需要阻塞一个线程,然后在尽可能少的开销中将其唤醒到另一个线程中。 mutex + condition variable有效,但是有很多开销。 一个futex也可以,但那只适用于Linux(或许不是?)。 只要轮询本身正常工作,就不需要额外同步,例如,当我在两个线程中调用wait和wake时没有竞争。 编辑:如果FreeBSD中不存在这样的“工具”,如何使用C ++ 11内置类型和系统调用创建一个? Edit2:由于这个问题被迁移到了SO,我想让它更通用(不仅仅适用于FreeBSD)

C中的primefaces读数

根据Are C ++读取和写入int Atomic? ,由于处理器缓存的问题,int的读取(以及因此指针 – 或者我认为)在C中不是primefaces的。所以,我的问题是是否有一些我可以用来制作读取primefaces的汇编,或者我需要使用锁吗? 我查看了几组primefaces操作库,到目前为止,我无法找到primefaces读取的函数。 编辑:编译器: Clang 2.9 编辑:平台: x86(64位) 谢谢。

如何使用pthread_atfork()和pthread_once()重新初始化子进程中的互斥锁

我们有一个C ++共享库,它使用ZeroC的Ice库来实现RPC,除非我们关闭Ice的运行时,否则我们观察到子进程挂在随机互斥锁上。 Ice运行时启动线程,具有许多内部互斥锁并保持打开文件描述符到服务器。 另外,我们有一些我们自己的互斥体来保护我们的内部状态。 我们的共享库被数百个内部应用程序使用,因此我们无法控制进程何时调用fork(),因此我们需要一种方法来安全地关闭Ice并在进程分叉时锁定我们的互斥锁。 在pthread_atfork()上读取处理互斥锁和内部状态的POSIX标准: 或者,某些库可能只能提供一个子例程,它将库中的互斥锁和所有关联状态重新初始化为某个已知值(例如,最初执行映像时的状态)。 但是,这种方法是不可能的,因为如果互斥锁或锁仍然被锁定,则允许实现失败* _init()和* _destroy()调用互斥锁和锁。 在这种情况下,子例程无法重新初始化互斥锁和锁。 在Linux上,此测试C程序从子pthread_atfork()处理程序中的pthread_mutex_unlock()返回EPERM。 Linux需要将_NP添加到PTHREAD_MUTEX_ERRORCHECK宏以便进行编译。 这个程序是从这个好的线程链接的。 鉴于解锁或破坏子代中的互斥锁在技术上是不安全或合法的,我认为最好有指向互斥锁的指针,然后让孩子在堆上创建新的pthread_mutex_t并让父项的互斥量单独使用,从而拥有小内存泄漏。 唯一的问题是如何重新初始化库的状态,我正在考虑重新设置pthread_once_t。 也许是因为POSIX有一个pthread_once_t的初始化程序,它可以重置为初始状态。 #include #include #include static pthread_once_t once_control = PTHREAD_ONCE_INIT; static pthread_mutex_t *mutex_ptr = 0; static void setup_new_mutex() { mutex_ptr = malloc(sizeof(*mutex_ptr)); pthread_mutex_init(mutex_ptr, 0); } static void prepare() { pthread_mutex_lock(mutex_ptr); } static void parent() { pthread_mutex_unlock(mutex_ptr); } static void child() […]

在C / C ++中实现跨平台,multithreading服务器的最佳方法是什么?

我与之合作的开发团队的一部分面临着编写服务器以与我们的产品集成的挑战。 我们有一些提供C SDK的低级传感器设备,我们希望通过网络共享它们以供收集数据的人使用。 听起来很简单吧? 有人会将传感器设备连接到建筑物的一部分中的机器并运行我们的服务器,从而与网络的其余部分共享设备。 然后,客户端将通过我们的应用程序连接到该服务器,并从设备收集传感器读数。 我创建了一个简单的,与语言无关的网络协议,以及Java中的参考实现。 问题是创建一个实现,它将与我们的设备一起使用,这些设备仅提供用C编写的SDK。我们正在考虑执行以下操作: 创建轮询线程,收集并存储每个连接设备的最新读数。 使用multithreading服务器将每个传入连接分离到工作线程。 当工作线程收到传感器读取请求时,轮询线程收集的最新值将被发送回客户端。 这是很multithreading,特别是在C中。因此,要审查,一般要求是: 在Windows XP / Vista,Linux和OS X计算机上运行 用C或C ++编写,与我们拥有的C SDK进行交互 接受可变数量的同时连接(工作线程) 必须使用线程,而不是分叉(不想处理另一层IPC) 谁能建议一个库,最好是一些示例代码才能开始使用?

是否有必要调用pthread_join()

我从main()创建了100多个线程,所以我只想知道在退出main()之前需要调用pthread_join()。 此外,我不需要这些线程生成的数据,基本上所有线程都在做一些独立于main()和其他线程的工作。

实现文件写入的互斥锁

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

错误地使用InterlockedCompareExchange以primefaces方式复制值?

我不能在这里使用C ++ 11primefaces 我对使用InterlockedCompareExchange()以“primefaces地”读取变量有疑问。 我在这里问了一个问题,但我在那里做的是不同的。 “交换”和“竞争者”参数(第2和第3)是“硬编码”值,即不从变量读取。 请考虑一下: // Copy the connect time DWORD dwConnectTime = InterlockedCompareExchange(&msgInfo.m_dwConnectTime, msgInfo.m_dwConnectTime, msgInfo.m_dwConnectTime); 这旨在将msgInfo.m_dwConnectTime的值与msgInfo.m_dwConnectTime的当前值msgInfo.m_dwConnectTime ,前提是msgInfo.m_dwConnectTime的当前值为msgInfo.m_dwConnectTime 。 然后返回msgInfo.m_dwConnectTime的先前值, 这是我依赖于“复制”该值的内容 。 虽然第二个和第三个参数本身的msgInfo.m_dwConnectTime读取不保证是primefaces的,但我刚才明白了。 因此,此代码是否不正确因此我需要使用锁定原语来复制msgInfo.m_dwConnectTime ?

什么是PTHREAD_MUTEX_ADAPTIVE_NP

在哪里可以找到“自适应”pthread互斥锁的文档? 符号PTHREAD_MUTEX_ADAPTIVE_NP是在我的系统上定义的,但我在网上找到的唯一文档没有说明自适应互斥锁是什么,或者什么时候适合使用。 那么……它是什么,我什么时候应该使用它? 作为参考,我的libc版本是: GNU C Library (Ubuntu EGLIBC 2.15-0ubuntu10.5) stable release version 2.15, by Roland McGrath et al. Copyright (C) 2012 Free Software Foundation, Inc. This is free software; see the source for copying conditions. There is NO warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. Compiled by GNU CC version […]

通过不同的线程使用多个ORB(multithreading多orb客户端应用程序) – 如何?

这个问题与以下内容有关: 是否可以在同一个进程中拥有多个ORB对象? 所以,多亏了@BrianKelly,我找到了有关ORB标识符的信息(即使在我所有的ORBACUS文档中都没有这样的信息),我成功创建了一个简单的应用程序,它连接到不同的CORBA服务器并成功执行了几个CORBA请求。 到现在为止还挺好。 现在,我想要做的是使这个应用程序multithreading并启动一个单独的线程来连接到不同的服务器。 但是ORB_init崩溃了。 这是一个非常短的代码,我用于测试: #include pthread_mutex_t mutex = PTHREAD_MUTEX_INITIALIZER; void* run( void * ); struct config { const char* nameservice; const char* id; const char* exe; }; const bool mt = true; int main() { config cfg1 = { “NameService=corbaloc::10.102.8.15:13069/NameService”, “1”, “test” }; config cfg2 = { “NameService=corbaloc::192.168.1.99:13069/NameService”, “2”, “test” }; if( […]

使用C中的GTK +单击按钮后,GUI变得无响应

#include #include #include #include #include void display(GtkButton * b, gpointer data) { while(1) { printf(“hurrah!”); } } void closeapp(GtkButton * b, gpointer data) { gtk_main_quit(); } int main(int argc,char *argv[]) { Widgets widg; printf(“hello”); GtkBuilder *gtkBuilder; GtkWidget *window; gtk_init(&argc,&argv); gtkBuilder = gtk_builder_new(); gtk_builder_add_from_file(gtkBuilder,”hello_world.glade”,NULL); window = GTK_WIDGET(gtk_builder_get_object(gtkBuilder,”mywindow”)); widg.e1 = GTK_ENTRY( gtk_builder_get_object(gtkBuilder, “entry1” ) ); gtk_builder_connect_signals(gtkBuilder, &widg); […]