Tag: multithreading

c中的线程计时器

有人可以帮助我将我的代码转换为工作代码: #include #include #include #include pthread_mutex_t mutex = PTHREAD_MUTEX_INITIALIZER; /* call back function – inform the user the time has expired */ void timeout_call_back() { printf(“=== your time is up ===\n”); // doing some other stuff } /* Go to sleep for a period of seconds */ static void* start_timer(void *args) { /* function pointer […]

用户和内核模式中的线程

线程在用户模式下运行并在内核模式下运行是什么意思? 这与用户模式的线程执行指令和内核模式的线程执行指令有关吗? 请详细说明。 另外,如果一个线程在用户模式下执行被置于挂起状态,它是否可能开始在内核模式下执行? 如果是的话,怎么可能呢? 到目前为止,我只知道一个线程如果被挂起将完全被SUSPENDED,即上下文切换将由CPU进行以安排另一个线程。

C线程和加入

我有一个关于C线程及其返回值的问题。 我的目标是找到起始编号和结束编号之间的所有素数。 我将有4个线程,每个线程执行四分之一的范围。 例如,1到100之间的素数。 线程1找到1到25之间的素数 线程2 26 – 50 线程3 51 – 75 线程4 76 – 100 所有素数都将存储在一个数组中,并且会有一个计算素数的函数。 我的问题是,当我加入线程时 pthread_join(tids[i], ptr); 将ptr指向所有素数的组合数组,1 – 100? 这意味着我使用for循环来打印值 printf(“%d”, ptr[i]); 它会将所有素数从1 – 100打印成一个大arrays吗? 我加入了4个独立的arrays吗? 谢谢

memcpy的multithreading编程

我正在为memcpy函数做一个优化任务,我在这里找到了这个链接。 如何提高memcpy的性能 由于我不熟悉multithreading编程,我不知道如何将下面的代码插入到原始主函数中? 如何将原始问题中的代码修改为multithreadingmemcpy项目? 我的意思是,如何为这个multithreadingmemcpy项目创建一个完整的项目。 在原始main函数中插入函数(如startCopyThreads或stopCopyThreads或mt_memcpy函数)的位置在哪里? #define NUM_CPY_THREADS 4 HANDLE hCopyThreads[NUM_CPY_THREADS] = {0}; HANDLE hCopyStartSemaphores[NUM_CPY_THREADS] = {0}; HANDLE hCopyStopSemaphores[NUM_CPY_THREADS] = {0}; typedef struct { int ct; void * src, * dest; size_t size; } mt_cpy_t; mt_cpy_t mtParamters[NUM_CPY_THREADS] = {0}; DWORD WINAPI thread_copy_proc(LPVOID param) { mt_cpy_t * p = (mt_cpy_t * ) param; while(1) { WaitForSingleObject(hCopyStartSemaphores[p->ct], […]

为win32 / C阻塞线程生产者/消费者的队列

我正在尝试用自定义队列替换一些线程通信,生产者当前正在使用PostThreadMessage,消费者正在使用WaitForSingleObject / PeekMessage。 http://www.justsoftwaresolutions.co.uk/threading/implementing-a-thread-safe-queue-using-condition-variables.html将是我所需要的,但是boost和C ++不是一个选择。 不想重新实现轮子,是否有人在C中实现了这样的队列?

关于Getcontext函数的问题

我正在尝试实现用户级线程库。 Getcontext函数用于保存当前线程在内存中的上下文。 函数Getcontext用于2种情况 保存当前上下文并移动到下一个线程 创建新的上下文 但是,在这两种情况下,它返回相同的值。 那么,我如何区分这两种情况呢? 谢谢

单个生产者/消费者循环缓冲区,仅阻止消费者

我想用单个生产者和单个消费者实现一个缓冲区,其中只有消费者可能被阻止。 这里重要的细节是,如果队列已满,生产者可以删除更新。 我考虑过转换一个等待免费的实现,但乍一看似乎没有简单的方法来通知消费者新的数据已经到达而不会丢失通知。 所以我使用计数信号量确定了下面非常简单的方法(为清楚起见,省略了一些error handling细节): Object ar[SIZE]; int head = 0, tail = 0; sem_t semItems; // initialized to 0 void enqueue(Object o) { int val; sem_getvalue(&semItems, &val); if (val < SIZE – 1) { ar[head] = o; head = (head + 1) % SIZE; sem_post(&semItems); } else { // dropped } } Object dequeue(void) […]

此示例是否包含数据竞争?

这是原始问题,但我的问题有些不同。 C ++内存模型 – 此示例是否包含数据竞争? 我的问题: //CODE-1: initially, x == 0 and y == 0 if (x) y++; // pthread 1 if (y) x++; // pthread 2 注意:上面的代码是用C语言编写的,而不是用C ++编写的(没有内存模型)。 那么它是否包含数据竞争? 从我的观点来看:如果我们在顺序一致性内存模型中查看代码,则没有数据竞争,因为x和y将永远不会同时为非零。 但是,我们永远不能假设顺序一致性内存模型,因此编译器重新排序可以进行相对于线程内正确性的转换,因为编译器不知道线程的存在…….对吗? 所以代码可以转换为: //CODE-2 y++; if (!x) y–; x++; if (!y) x–; 上面的转换并没有违反顺序正确性所以它是正确的。这不是编译器的错,对吧? 所以我同意CODE-1包含数据竞争的观点。你呢? 我有一个额外的问题,带有内存模型的C ++ 11可以解决这个数据竞争因为编译器知道线程,所以他们会根据内存模型类型进行重新排序,对吧?

如何异步地异步停止X11事件循环

我有一个小的X11应用程序,它有两个线程。 在一个线程中,我正在使用XGrabKey()然后在循环XNextEvent()侦听X11事件。 另一个线程正在做其他事情并且与X11无关。 这是相关线程的代码: #include #include #include #include #include #include volatile bool loop = true; void keyGrab(void) { Display *display = XOpenDisplay(0); Window root = DefaultRootWindow(display); int keycode = XKeysymToKeycode(display, XF86XK_AudioPlay); XGrabKey(display, keycode, AnyModifier, root, False, GrabModeAsync, GrabModeAsync); XSelectInput(display, root, KeyPressMask); while (loop) { XEvent event; XNextEvent(display, &event); switch (event.type) { case KeyPress: puts(“Play key […]

线程参数的高效快捷方式

使用参数创建线程的最有效方法是什么? 参数是一个结构,如果结构不能保留在父线程堆栈上,则有两种解决方案。 具有动态内存分配 struct Arg{ int x; int y; }; void* my_thread(void* v_arg){ Arg* arg = (Arg*) v_arg; //… running delete arg; return NULL; } //Creating a thread void a_function(){ Arg* arg = new Arg; arg->x = 1; arg->y = 2; pthread_t t; pthread_create(&t, NULL, my_thread, arg); pthread_detach(t); } 用信号量 struct Arg{ sem_t sem; int […]