Tag: multithreading

如何在C(Android NDK)中杀死子线程?

在你告诉我我不应该杀死线程然后发送信号/设置一个标志让他们作出反应之前,让我解释一下这个场景: 我正在使用OpenSL API在Android NDK中开发音频播放器(播放本地mp3文件),但Android实现有一个错误,如果我对文件重复执行搜索操作,该线程可悲地挂起一种内部死锁当我尝试释放资源时(SLObjectItf-> Destroy)。 所以我将destroy例程移动到子线程并等待一段固定的时间让它完成,如果没有,我认为该线程被挂起并继续执行泄漏一些资源,这比不得不去系统设置并手动终止应用程序。 我尝试使用信号SIGTERM和SIGKILL来杀死使用pthread_kill的子线程,但它似乎都终止了我的整个应用程序并且Android重新启动它。 我不能使用pthread_cancel,因为线程被绞死,Android NDK也不支持该方法。 有没有办法杀死子线程而不杀死整个应用程序? 编辑:这是线程和启动它的代码 static void *destroyDecoderInBackground(void *ignoredArgument) { if (decoderObject != NULL) { __android_log_print(ANDROID_LOG_INFO, “OpenSLES”, “Destroying decoder object”); (*decoderObject)->Destroy(decoderObject); __android_log_print(ANDROID_LOG_INFO, “OpenSLES”, “Decoder object destroyed”); decoderObject = NULL; decoderPlay = NULL; decoderSeek = NULL; decoderBufferQueue = NULL; } pthread_mutex_lock(&destroyDecoderLock); pthread_cond_signal(&destroyDecoderCond); pthread_mutex_unlock(&destroyDecoderLock); pthread_exit(0); } static void destroyDecoder(JNIEnv* env) { […]

Libevent:multithreading处理HTTP保持连接

我正在使用Libevent在C中编写HTTP反向代理,我想实现multithreading以利用所有可用的CPU内核。 我看了一下这个例子: http : //roncemer.com/software-development/multi-threaded-libevent-server-example/ 在这个例子中,似乎一个线程用于连接的整个持续时间,但对于HTTP 1.1,我不认为这将是最有效的解决方案,因为默认情况下连接在每个请求后保持活动状态,以便它们可以重用后来。 我注意到,即使一个浏览器面板也可以打开几个连接到一个服务器并保持打开,直到选项卡关闭,这将立即耗尽线程池。 对于HTTP 1.1代理,将有许多开放连接,但只有极少数人在给定时刻主动传输数据。 所以我在想一个替代方案,为所有传入连接创建一个事件库,并将事件回调函数委托给工作线程。 这样我们可以有许多打开的连接,只有当数据到达连接时才使用线程,一旦处理完数据就将其返回池中。 我的问题是:这是一个与Libevent合适的线程实现吗? 具体而言 – 是否需要在每个连接中都有一个事件库,如示例中所示,或者所有连接都足够? 另外 – 我还应该注意其他任何问题吗? 目前我能看到的唯一问题是突发性,当在许多小块中接收到数据时,每个HTTP响应触发许多读取事件,这将导致大量切换到工作线程。 这会是个问题吗? 如果它会,那么使用Libevent的水印可能会有点否定,虽然我不确定如果请求到达两个块并且第二个块足够小以使缓冲区大小低于水印,这是如何工作的。 它会留在那里直到更多数据到来吗? 此外,我需要实现调度,以便只有在前一个块完全发送后才会发送一个块。 我想到的第二个问题是当线程池耗尽时,即所有线程当前正在执行某些操作,并且发生另一个读取事件 – 这将导致读取事件回调阻塞。 那有关系吗? 我想把这些放到另一个队列中,但肯定这正是事件库内部发生的事情。 另一方面,第二个队列可能是组织块的调度而不阻塞工作线程的好方法。

如何根据用户请求安全地停止正在运行的线程?

我正处于根据GUI上的用户操作在线程运行时必须终止线程的情况。 我在Windows上使用Qt 4.5.2。 一种方法是: class MyThread : public QThread { QMutex mutex; bool stop; public: MyThread() : stop(false) {} void requestStop() { QMutexLocker(&mutex); stop = true; } void run() { while(counter1–) { QMutexLocker(&mutex); if (stop) return; while(counter2–) { } } } }; 请注意,上述代码很少。 运行function在完成之前最多需要20秒,所以我想避免在循环中锁定和解锁mutex变量。 有没有比这种方法更快的方法。 提前致谢。

什么时候摧毁pthread屏障是否安全?

如果我有一个初始化的pthread_barrier_t,什么时候可以安全地销毁它? 以下示例是否安全? pthread_barrier_t barrier; … int rc = pthread_barrier_wait(b); if (rc != PTHREAD_BARRIER_SERIAL_THREAD && rc != 0){ perror(“pthread_barrier_wait”); exit(1); } if (id == 0){ if(pthread_barrier_destroy(&(threads[t_root].info.tmp_barrier))){ perror(“pthread_barrier_destroy”); exit(1); } }

将参数传递给_beginthread() – 什么是错的?

我有这个代码,我没有得到预期的结果……什么是错的? typedef struct { int data1; int data2; }t; void foo(int a, int b) { Handle handle; t arg; arg.data1 = a; arg.data2 = b; handle = (HANDLE) _beginthread( myFunc, 0, (void*) &arg); } void myFunc(void *param) { t *args = (t*) param; int x = args->data1; int y = args->data2; printf(“x=%d, y=%d\n”, x, y); […]

在GtkScrolledWindow或GtkEventBox上绘画

使用GTK,我试图在GtkScrolledWindow包含的GtkTextView的角落覆盖一个“更多”提示(但它也可以是任何绘图对象)。 我在处理程序中绘制文本视图的expose信号的提示。 它可以工作,但是当我滚动窗口时,我得到了工件:提示随文本视图的内容一起移动而不会被删除。 为了消除伪影,我在每次滚动后触发重绘。 这大部分都有效,但是当你快速滚动时,你仍然可以看到提示上下跳动。 有什么办法可以防止这种情况吗? 如果提示只是“浮动”在文本视图的顶部,那将是很好的。 我尝试将滚动窗口封闭在GtkEventBox并在其上绘制提示,但这也不起作用; 滚动条和文本视图总是在提示上绘制,即使您将事件框的窗口设置为在其子窗口前面也是如此。 UPDATE 如果我使用g_signal_connect_after()连接GtkEventBox的公开回调,那么在GtkScrolledWindow和GtkTextView的公开回调之后调用它。 尽管文本视图仍然覆盖了事件框。 我认为这是因为滚动是异步发生的。 有人知道如何防止我的图画被覆盖吗? 另一个更新 所以我想我真正需要的是在异步滚动完成时连接的信号。 如果我能找到它的时间,那么我可以在GtkEventBox上触发另一个公开事件。 滚动完成后如何收到通知?

`asprintf`是线程安全的吗?

GNU函数asprintf (打印到分配的字符串)线程安全吗? (IIC,基本上,这归结为malloc是否是线程安全的问题。) 考虑示例代码: #define _GNU_SOURCE #include #include “getValue.h” char * getValue(int key) { char * value; asprintf(&value, “%d”, key); // TODO: No error handling! // If memory allocation wasn’t possible, or some other error occurs, these functions will // return -1, and the contents of strp is undefined. return value; } 在这里,我不触及任何全局变量。 如果我的getValue在并发线程中被调用怎么办? 没有坏事会发生,他们会吗?

使用C问题在线程之间传递数据

我想知道如何使用C语言在线程之间传递数据。 例如:X等待来自某个地方的消息。 Y向TX发送有关事件的消息并等待响应。 TX处理事件并向TY发送响应。 TX等待另一条消息。

输入void void *(*)(void *)为void(*)(void)

作为赋值的一部分,我试图创建一个像pthreads这样的用户级线程库。 为了处理线程之间的上下文切换,我使用’swapcontext’函数。 在使用它之前,我必须使用’makecontext’函数创建一个上下文。 ‘makecontext’需要一个返回类型为void且参数类型为(void)的函数指针。 然而,线程函数必须是void* thread_func (void*) 有没有办法进行类型转换? 或者是否有其他方法在用户级别进行上下文切换?

零螺纹工艺?

进程是否必须至少包含一个线程? 进程是否可能没有任何线程,或者这没有意义?