Tag: multithreading

穿越C语言,跨平台

我正在处理当前在单个线程上运行的现有项目(在C中),我们希望在多个平台上运行并且具有多个线程。 希望有一个库,因为,恕我直言,Win32 API就像反复盯着自己的眼睛。 我知道Boost.Thread for C ++,但是,这必须是C(并且可以在MinGW和gcc上编译)。 对不起,Cygwin不是一个选择。

这种信号量的实现如何工作?

圣诞快乐! 我正在读“信号量小书” 。 书中有一个C语言的实现,我并不完全理解。 请参阅下面的代码。 有这个唤醒变量。 作者解释说: 唤醒计算未决信号的数量; 也就是说,已被唤醒但尚未恢复执行的线程数。 唤醒的原因是为了确保我们的信号量具有第4.3节中描述的属性3 和 属性3:如果线程执行信号时有线程在等待信号量,则必须唤醒其中一个等待线程。 好的,我想我理解了这个属性的含义。 其中一个等待线程应该获取互斥锁而不是另一个(例如信令线程)。如果我错了,请纠正我。 我不明白的是这个机制如何保证这个属性。 我会说房产不保证。 非等待进程仍然可能获得互斥锁。 我错过了什么? typedef struct { int value, wakeups; Mutex *mutex; Cond *cond; } Semaphore; // SEMAPHORE Semaphore *make_semaphore (int value) { Semaphore *semaphore = check_malloc (sizeof(Semaphore)); semaphore->value = value; semaphore->wakeups = 0; semaphore->mutex = make_mutex (); semaphore->cond = make_cond […]

“阻止系统调用”是什么意思?

“阻止系统调用”是什么意思? 在我的操作系统课程中,我们正在研究multithreading编程。 我不确定当我在我的教科书中阅读时它是什么意思“它可以允许另一个线程在线程进行阻塞系统调用时运行”

如何从C#调用C(P / invoke)代码“线程安全”

我有一些使用单个全局变量的简单C代码。 显然这不是线程安全的,所以当我使用P / invoke从C#中的多个线程调用它时,事情搞砸了。 如何为每个线程单独导入此函数,还是使其线程安全? 我尝试声明变量__declspec(thread) ,但这导致程序崩溃。 我也试过制作一个C ++ / CLI类,但它不允许成员函数是__declspec(naked) ,我需要(我使用的是内联汇编) 。 我编写multithreadingC ++代码并不是很有经验,所以我可能会遗漏一些东西。 这是一些示例代码: C# [DllImport(“MyDll.dll”, CallingConvention = CallingConvention.Cdecl)] public static extern int SomeFunction(int parameter1, int parameter2); C ++ extern “C” { int someGlobalVariable; int __declspec(naked) _someFunction(int parameter1, int parameter2) { __asm { //someGlobalVariable read/written here } } int __declspec(dllexport) SomeFunction(int parameter1, int […]

为什么这段代码不能线性扩展?

我写了这个SOR求解器代码。 不要太费心这个算法做什么,这不是关注点。 但仅仅为了完整性:它可以解决线性方程组,这取决于系统的条件有多好。 我用一个病态的2097152行sparce矩阵(从不收敛)运行它,每行最多7个非零列。 翻译:外部do-while循环将执行10000次迭代(我传递的值为max_iters ),中间将执行2097152次迭代,拆分为work_line块,在OpenMP线程之间划分。 最里面的for循环将有7次迭代,除非极少数情况下(小于1%)它可以更少。 sol数组中的线程之间存在数据依赖性。 中间的每次迭代都会更新一个元素,但最多可读取数组的其他6个元素。 由于SOR不是一个精确的算法,在读取时,它可以具有该位置上的任何先前值或当前值(如果您熟悉求解器,这是一个Gauss-Siedel,在某些地方容忍Jacobi行为,为了并行)。 typedef struct{ size_t size; unsigned int *col_buffer; unsigned int *row_jumper; real *elements; } Mat; int work_line; // Assumes there are no null elements on main diagonal unsigned int solve(const Mat* matrix, const real *rhs, real *sol, real sor_omega, unsigned int max_iters, real tolerance) { real […]

如何通过pthreads管理两个或更多的消费者?

我有一个通用的问题,我希望解决,从标准输入或常规文件流发送到应用程序的二进制数据块,然后将二进制数据转换为文本。 使用线程,我想在将文本传递给下一个应用程序之前处理文本,然后进一步修改该文本,依此类推。 作为一个简单的测试用例,我想通过gunzip提取压缩数据。 具体来说,我正在使用gunzip -c -提取通过其(重新分配的) stdin文件描述符发送给它的二进制数据块,然后从其(重新分配的) stdout文件描述符中提取出大量文本。 然后我可以将这些文本块打印到真正的stdout或stderr (或者做其他事情,稍后再做)。 (我意识到我可以在命令行上进行基于gzip的压缩和提取。我的目标是使用这个测试用例来学习如何在通过二进制文件运行数据的线程之间正确传递二进制和文本数据的通用块,或进一步处理。) 在我的测试程序中,我设置了三个pthread_t线程: produce_gzip_chunk_thread consume_gzip_chunk_thread consume_gunzip_chunk_thread 我为每个线程传递了一个名为thread_data的共享数据实例,它包含一个线程锁,两个条件,以及一些缓冲区和计数器变量。 我还为使用popen3()打开的gunzip进程popen3() : typedef struct pthread_data pthread_data_t; typedef struct popen3_desc popen3_desc_t; struct pthread_data { pthread_mutex_t in_lock; pthread_cond_t in_cond; pthread_cond_t out_cond; unsigned char in_buf[BUF_LENGTH_VALUE]; size_t n_in_bytes; size_t n_in_bytes_written_to_gunzip; size_t n_out_bytes_read_from_gunzip; FILE *in_file_ptr; boolean in_eof; char in_line[LINE_LENGTH_VALUE]; popen3_desc_t *gunzip_ptr; }; struct popen3_desc […]

使用MPI终止所有进程

我正在使用MPI来搜索解决方案,以便在不同线程之间划分问题空间。 每个线程都经过一个for循环,每次迭代都是解决方案的候选者。 问题是,当一个线程找到解决方案时,我希望它通知其他线程并且它们应该立即终止(或者至少在它们当前迭代结束时 – 或者下一个的开始)。 我怎么能用MPI做到这一点?

运行多个并发GMainLoops

是否允许GLib用户在多个线程中同时运行多个GMainLoop实例,每个线程都运行自己的实例? 我发现整个地方都有“是”和“否”的答案。 我意识到之前在这个论坛(2011年12月)已经提出了这个问题。 但是,我能够在没有明显问题的情况下同时运行两个GMainLoop实例。 我的测试代码非常简单: 在main()创建一个GMainLoop 使用g_timeout_add为默认上下文和主循环创建超时源 在main()中创建一个GThread 使用g_main_loop_run运行主循环 [THREAD CONTEXT]:使用g_main_context_new创建上下文 [THREAD CONTEXT]:使用g_main_context_push_thread_default将该上下文设置为线程默认值 [THREAD CONTEXT]:使用g_main_loop_new创建一个循环并g_main_loop_new提供新的上下文 [THREAD CONTEXT]:创建超时源,并通过g_source_attach将其附加到新上下文。 [THREAD_CONTEXT]:让线程调用g_main_loop_run 这样做,我看到GMainLoop两个实例GMainLoop运行得很好。 正确调用超时回调,稍后对g_main_loop_quit的调用按预期工作。 因此,让多个GMainLoop实例同时工作似乎不是问题。 但也许我只是没有充分运用API来完全掌握这种情况。 这个问题有明确的答案吗? 另外,如果有人关心的话,这是实际的测试代码: #define THREAD_TIMEOUTS (20) #define MAIN_TIMEOUS (1) typedef struct timeout_struct { int i; int max; GMainLoop *loop; char *name; } TIMEOUT_STRUCT; gboolean timeout_callback(gpointer data) { TIMEOUT_STRUCT *psTimeout = (TIMEOUT_STRUCT *)data; psTimeout->i++; if […]

C socket API是线程安全的吗?

我正在使用Linux和Win32套接字API。 在我的程序中,多个线程共享套接字句柄。 特别是,多个线程使用共享套接字句柄(即,相同的端口)调用send 。 在这种情况下,我是否必须锁定线程安全? 我无法找到答案。 我可以做一个测试,但想听听你的经历。 编辑 :我知道通过套接字发送数据根本不是primefaces操作。 当然,我们必须使用互斥锁来保证线程安全。 但是,我想知道系统API是否可以拥有自己的内部锁。 如果是这样,我们可以省略自己的锁定。 这个问题也可能适用于fprintffunction。 我想知道这样的系统API会有自己的锁。 根据我的经验,从多个线程调用fprintf并没有杀死我的程序,虽然文件或stdout上有比赛(即输出不一致或不可预测,但程序没有崩溃),这暗示fprintf有一个锁来保护他们的内部数据结构。

如何在C中编写线程安全,高效,无锁的内存分配器?

如何在C中编写线程安全,高效,无锁的内存分配器? 我的意思是: 快速分配和解除分配 最佳内存使用(最小浪费和无外部碎片) 最小的元数据开销