Tag: multithreading

sem_timedwait()pthreads-win32 errno用法

我在Win32应用程序上使用pthreads-win32作为线程。 我正在使用此处发布的第一个函数计算timespec。 对sem_timedwait()的调用似乎在等待指定的ts时间,但是每次完成时我都会得到以下消息: 等待信号量时出错:没有错误 我在这里检查了sem_timedwait.c的文件,它们指定了相同的errno值和返回值。 因此,我不知道为什么它会退出这个错误,并想知道原因。 #ifdef _WIN32 #define HAVE_STRUCT_TIMESPEC #endif // _WIN32 #include #include #include #include #include #include #include #include #include “include.h” // Platform includes #ifdef _WIN32 #include #include #else #include #include #include #include #include #include #endif // _WIN32 // … sem_init(&job_semaphore, 0, 0); // … // Set wait time relative to current time […]

具有直接呼叫和间接呼叫的Openssl线程安全回调函数注册

我正在Linux中编写一个C库(比方说,libA),它利用Openssl来执行base64编解码器,哈希等。其他一些项目(例如projB)利用libA来做某事,而这些项目本身也调用了Openssl API。 因此,projB以两种方式调用Openssl API: 直接调用Openssl API:projB – > Openssl 间接调用Openssl API:projB – > libA – > Openssl 同时,它正式宣布 Openssl不是线程安全的,除非在Openssl中注册了至少两个回调函数: void ssl_locking_function(int mode,int n,const char * file,int line) unsigned long ssl_threadid_function() libA向projB公开以下API: int InitA(无效) int ActionStuff() void DestroyA() 为了确保Openssl的线程安全,有两个解决方案: #1。 libA在InitA()中将回调函数注册到Openssl中 #2。 在调用libA API之前,projB在初始化时将回调函数注册到Openssl中,并且libA不进行回调注册 对于解决方案#1,libA本身是线程安全的,关于调用Openssl API。 但是,projB还必须确保其线程安全性,并且它将采取类似的操作将回调函数注册到Openssl中。 假设libA注册以下回调函数 void ssl_locking_function_A(int mode,int n,const char * file,int line) […]

如何在不执行脚本的情况下加载lua变量和函数?

我看到的每个地方,我都看到从许多C线程运行lua脚本的最佳实践是为每个线程使用不同的lua_State。 从这一点开始,请使用以下脚本: local var1 local var2 — etc. function onClick(x, y) — Process mouse click end function onKey(k) — Process key stroke end — Do some stuff while(true) do — Do some stuff end 其中onClick和onKey是Win32应用程序调用的回调函数。 这些函数逐个C线程调用。 其中每一个都拥有自己的lua_State。 因此,总共有3个C线程(和3个lua_States):一个用于上述每个函数,最后一个用于运行不是函数的所有东西(while循环和东西)。 因此,由于Lua只能在lua_dofile和lua_dofile执行所有操作之后才能看到脚本中的内容,如何在不执行整个脚本的情况下调用这些函数? 我只想让一个线程卡在无限循环中; 其他人必须等待回调函数。

如何在OpenMp中管理共享变量

我正在尝试编写一个OpenMp程序。 我有一个for循环,迭代100次。 我把它分成10个线程。 每个线程运行10次迭代并根据某些条件生成一些计数。 因此,根据这个逻辑,每个线程将生成自己的计数。 我想要的只是将这个计数复制到一个变量,该变量将保存所有线程中所有计数的总和。 如果我们让这个变量(共享)在循环中写入,我猜它会序列化线程。 我只想将每个线程的最后一个计数复制到一个全局变量中。 这样我将只序列化10个赋值语句。 我试图使用lastprivate但我对如何使用它来满足我的要求感到困惑。 这是我的代码 #pragma omp parallel for private(i) schedule(dynamic) shared(count) for (i = 1; i <= 100 ; i++) { if(i%2==0) count++; } printf("Total = %d \n", count);

通过fifo将curses输入发送到C中的另一个终端

我的C程序在终端中运行多个线程,异步打印消息。 我想要一个显示curses输出的线程,但由于它是异步的,它必须在另一个终端中。 我的想法是将curses输出写入fifo并使用cat fifo打开终端。 但是我如何才能恢复输出诅咒并将其输出到文件中? 谢谢。

如何使用clone()使父进程和子进程同时运行?

我是linux的新手。 我想同时制作子进程和父进程。 但我失败了。 这是我的代码。 有谁能够帮我? #define _GNU_SOURCE #include #include #include #include #include #define FIBER_STACK 8192 void * stack; int do_something(){ int a = 0; while (a<10){ printf("pid : %d, a = %d\n", getpid(), a++); } exit(1); } int main() { void * stack; stack = malloc(FIBER_STACK); if(!stack) { printf("The stack failed\n"); exit(0); } int a […]

使用线程库中的getcontext()进行分段错误

我正在尝试使用系统调用(例如get context,swap context等)在C中实现用户级线程库 我有一个如下所示的线程控制块: struct tcb { int thread_id; int thread_pri; ucontext_t *thread_context; struct tcb *next; } 我有一个名为init()的函数,如下所示: void t_init() { tcb *tmp; tmp = malloc(sizeof(tcb)); getcontext(tmp->thread_context); /* let tmp be the context of main() */ running_head = tmp; } 我使用了gdb,我在运行期间在getcontext(tmp-> thread_context)函数中遇到了分段错误。 我已经阅读了getcontext()的手册页,但我不确定为什么这会给我返回一个分段错误! 有什么建议吗?

测量Mutex和Busy等待的效率

该程序将创建多个线程,其中每个线程使用for循环将共享变量增加10000,在每次迭代中将其递增1。 需要互斥锁和自旋锁(忙等待)版本。 据我所知,互斥版本应该比自旋锁更快。 但我实施的内容给了我一个相反的答案…… 这是互斥锁版本中每个线程的实现: void *incr(void *tid) { int i; for(i = 0; i < 10000; i++) { pthread_mutex_lock(&the_mutex); //Grab the lock sharedVar++; //Increment the shared variable pthread_mutex_unlock(&the_mutex); //Release the lock } pthread_exit(0); } 这是自旋锁版本中的实现: void *incr(void *tid) { int i; for(i = 0; i < 10000; i++) { enter_region((int)tid); //Grab the lock sharedVar++; […]

在C程序中打开与fopen(使用multithreading)

由于未知原因,似乎fopen在关闭之前重复调用文本文件时无法打开文本文件。 我的C程序使用multithreading,每个线程处理一种类型的输出文本文件(每种类型11个),每种类型都在一个单独的文件夹中。 我需要保留在长时间执行期间打开的这些文件以及在同一个线程中写入大量数据。 为了更好地解释它,过程如下: 1-线程#1启动并在一个文件夹中创建和写入11个文件。 2-在不关闭以前的文件的情况下,线程#2启动并创建并在另一个文件夹中写入另外11个文件。 3-与其他两个线程相同。 4-最后,当创建了所有需要的文件并且所有线程都已完成,除非是主文件,所有文件都被关闭。 然而令人惊讶的是,open能够同时处理所有这些文件。 有没有人对fopen的这个问题有一个提示? 我不知道它是否与multithreading或fopen可以同时处理的最大文件数有关。 我在Borland编译器的Windows平台上。

使用ExitThread关闭线程 – C.

我有一个简单的程序,它创建一个线程,循环二十次,然后调用关闭自己并执行必要的清理。 当我调试程序时,它到达ExitThread(); 方法和暂停,忽略printf(); 我在它之后设立了信号告诉我它已经关闭了。 这是正常的还是我忘了做某事? 我是使用C进行线程化的新手。 主要() void main() { Time t; int i = 0; StartTimer(); for(i = 0; i < 20; i++) { t = GetTime(); printf("%d.%.3d\n", t.seconds, t.milliseconds); Sleep(100); } StopTimer(); } 线程创建 void StartTimer() { DWORD threadId; seconds = 0; milliseconds = 0; // Create child thread hThread = CreateThread( NULL, […]