Tag: multithreading

Pthread_t没有开始

我写了这个简短的例子,以便理解C中的线程编程。我应该编写“线程0”。 但是没有输出。 这是代码。 #include #include #include int i=0; pthread_mutex_t mutex; void * fonction(){ pthread_mutex_lock(&mutex); printf(“thread %d \n”,i++); pthread_mutex_unlock(&mutex); pthread_exit(NULL); } int main(){ pthread_t a; pthread_mutex_init(&mutex,NULL); pthread_create(&a,NULL,fonction,NULL); return EXIT_SUCCESS; } 有人能帮我吗 ? Ps:我用它来编译它 gcc -pthread test.c -o test

联锁function和primefaces性:仍然困惑

我仍然对以primefaces方式读取和写入变量感到困惑。 对于那些在以前的问题中试图提供帮助的人,请提前抱歉。 今天我被告知,在读取和写入一个32位long值时,不需要任何Interlocked函数调用,这会打破我以前的信念 。 实际上,这支持了MSDN所说的内容 对正确对齐的32位变量的简单读取和写入是primefaces操作。 换句话说,您最终只会更新变量的一部分; 所有位都以primefaces方式更新 然后我看看atomic_long中的atomic_long是做什么的; 其operator=使用新值对当前值执行_InterlockedExchange() 。 这不与MSDN相矛盾; 如果读/写是primefaces的,为什么需要这个Interlocked函数? 在同一个MSDN页面上,我们也有 对64位Windows进行简单的读取和写入正确对齐的64位变量是primefaces的。 在32位Windows上,不保证对64位值的读写操作是primefaces的。 对其他大小的变量的读写不保证在任何平台上都是primefaces的。 所以我接着进入atomic_bool的’ operator= ; 它执行_InterlockedExchange8调用, MSDN告诉我该调用仅适用于Windows 8及更高版本。 这似乎支持第二个MSDN报价。 如果我使用VS 2005并针对Windows XP,我如何确保布尔变量的primefaces读/写? 我是否必须使用互斥锁或类似的? 如果读/写操作不是primefaces的,那么它就容易被撕裂; 那是对的吗? 我读过这个PAQ ,说原始类型不是primefaces的。 这再次与我在问题中告诉我的内容以及MSDN告诉我的内容相矛盾。 谁是对的?

如何使用它来杀死线程数组?

这段代码工作正常,但如何使用它来杀死剩余线程数组? #include #include #include void *print1(void *tid) { pthread_t *td= tid; pthread_mutex_t lock1=PTHREAD_MUTEX_INITIALIZER; pthread_mutex_lock(&lock1); printf(“1”); printf(“2”); printf(“3”); printf(“4\n”); printf(“Coming out of thread1 \n”); sleep(2); pthread_mutex_unlock(&lock1); pthread_kill(*td,SIGKILL);//killing remaining all threads return NULL; } void *print2(void *arg) { pthread_mutex_t *lock = arg; pthread_mutex_lock(lock); sleep(5); printf(“5”); sleep(5); printf(“6”); sleep(5); printf(“7”); sleep(5); printf(“8\n”); fflush(stdout); pthread_mutex_unlock(lock); return NULL; } int […]

警告:’noreturn’function确实会返回

我正在做一个线程库(用uncontext.h改变上下文)。 我的函数是void类型,我无法返回。 但即使我没有返回,编译时会出现此警告: dccthread.c: In function ‘dccthread_init’: dccthread.c:184:1: warning: ‘noreturn’ function does return [enabled by default] } 这是函数的简化代码(没有一些细节): void dccthread_init(void (*func), int param) { int i=0; if (gerente==NULL) gerente = (dccthread_t *) malloc(sizeof(dccthread_t)); getcontext(&gerente->contexto); gerente->contexto.uc_link = NULL; gerente->contexto.uc_stack.ss_sp = malloc ( THREAD_STACK_SIZE ); gerente->contexto.uc_stack.ss_size = THREAD_STACK_SIZE; gerente->contexto.uc_stack.ss_flags = 0; gerente->tid=-1; makecontext(&gerente->contexto, gerente_escalonador, 0); if (principal==NULL) […]

从另一个线程操作GUI控件有什么问题吗?

我总是听说我应该只从GUI线程操作GUI控件,但我不明白从另一个线程这样做有什么问题。 我的意思是如果我想更改Window的标题栏文本,我需要做的就是向Window的消息队列发送消息。 那么从另一个线程做到这一点有什么不对?

结束gcc C Linux中第一个成功的线程

我是一位经验丰富的C程序员,以前从未使用过线程或并行。 我一直在读它,但我没有看到我想要的例子。 我在Mac和Linux上使用gcc C编译器。 我想在我的系统中用一个新的过程X2替换一个重要的过程X,它将启动两个方法,因为只要机器有多个CPU,这两天就会在两个不同的处理器上运行(大多数情况下都是这样)。 这两种方法可能共享一些全局变量,但它们不会写入除自己的堆栈之外的任何内存位置。 他们每个人都会调用系统中的许多其他程序。 我没有想到任何其他并行处理。 一旦任何一个线程完成,那就是它! 这就是答案。 X2应该立即杀死另一个线程并将答案返回给任何调用X2的人。 也许我天真但我认为这是一个众所周知的线程使用。 示例代码请!

仅在读取共享内存时锁定互斥锁

我的印象是否正确,如果线程之间的共享内存只被读取而且从未被任何线程写入,那么互斥保护是不必要的? 这是因为无论线程被抢占,它都可以在重新安排时再次起飞,并且内存内容不会发生变化。

Android 4.4和5.0中multithreading加速的效率完全不同

我写了一段C代码来在Android中进行一些图像处理(密集计算)(由NDK编译并由jni.h使用)。 为了加速图像处理,我在C代码中使用了pthread_create和pthread_join函数来利用4个线程同时处理图像。 multithreading加速在Android 4.4手机中是成功的,但在所有Android 5.0手机中都失败了。 假设在单线程环境中image_processing函数的处理时间是1s。 我们利用4个线程来加速image_processing函数,如下所示: void image_processing_multiply_threads() { int i; pthread_t pt[4]; for(i = 0 ; i < 4; i++) { if ( pthread_create(pt + i , NULL, image_processing, (void *)(arg + i)) != 0 ) { return; } } for (i = 0; i < 4; i++) { pthread_join(pt[i], NULL); } } […]

读/写器伪代码中竞争条件的可能性

我正在分析以下关于竞争条件的伪代码(一些自我练习)并查看可能性的位置。 伪代码描述了一个模糊的异步读写器。 作家线程 r = 0; w = 1; l = 2; //assign start slot numbers while(1) { write_slot(w); l = w; //last written slot is ww = not(r,l) //assigns next slot so that w is neither r or l } 读者主题 while(1) { r = l; //read from latest write read(r); } 到目前为止我发现的腐败/竞争条件的可能性是,如果变量读/写不是primefaces的,那么,例如,当读者读到它时,作者可以改变l的值(可能导致通过撕裂读/写的无意义的r值)。 是否有任何竞争条件可能导致读者和作者试图访问同一个插槽?

在错误的线程中调用信号处理程序

我想知道是否有可能中断主线程并要求它执行一些回调。 主线程应该继续完成回调后的操作。 例如,我们有2个线程t1和m1(主线程)。 t1将中断m1(主线程)并要求它用一些参数调用一个函数。 m1(主线程)将停止执行之前的操作并将开始执行该function。 完成function后,它将恢复到之前的function。 我想复制硬件中断的作用。 我有一个线程从文件中读取数据。 然后它应该要求主线程调用一个函数。 主线程将做一些事情。 它应该停止这样做并开始执行该function。 完成后,主线程应该继续它正在做的事情 我使用信号编写了以下代码 #include #include #include #include static void catch_function(int signo) { int id = GetCurrentThreadId(); printf(“\nThread ID is %d”,id); signal(SIGINT, catch_function); } DWORD WINAPI MyThreadFunction( LPVOID lpParam ) { int id = GetCurrentThreadId(); printf(“\nChild Thread ID is %d”,id); while(1) { Sleep(50); if (raise(SIGINT) != […]