Tag: multithreading

C / C ++中的基本multithreading – 提示,建议,教程,某些方向?

我想学习如何构建一个multithreading应用程序,但我甚至不知道从哪里开始。 大多数人如何实现multithreading? 他们使用升级库吗? 还有其他方法吗? (使用标准C / C ++) 我理解这个概念,但完全不知道从哪里开始真正学会如何去做。 谁能推荐任何东西? http://msdn.microsoft.com/en-us/library/7t9ha0zh%28v=VS.80%29.aspx <—这些是标准的C ++,还是一些仅限Microsoft的实现? 我是否认为multithreading库包含在Windows API中? 我在MSDN上找到了一个例子( http://msdn.microsoft.com/en-us/library/esszf9hw%28v=VS.80%29.aspx ),它使用的函数(ReleaseMutex等)似乎在windows中。H。 这是大多数人在进行Windows编程时使用的吗?

分段错误p_thread可能存在竞争条件

问题:我创建了一个子线程TIDS的链接列表,并希望在继续主线程之前等待所有子tid完成执行。 基本上我有目录遍历(目录由给定struct的成员指定)。 每当我看到一个目录或文件时,我都会创建一个新线程并将其threadID放入链表中。 但是,当我遍历链表并调用pthread_join我得到一个分段错误(核心转储) – 我无法理解为什么。 我相信可能与种族状况有关,但我不确定。 当我删除pthread_join我不再是段错误但是我没有完全遍历目录中的目录。 程序: void *handy(void *arguments) { static pthread_t threadA; threadA=pthread_self(); handarg *thestruct=(handarg*)arguments; DIR *dp=opendir(thestruct->directory); DIR *outExist=opendir(thestruct->outputdirectory); if(outExist==NULL) { if((thestruct->outputdirectory = “”)) { ; } else { printf(“The outputdirectory doesnt exist, program terminated\n”); exit(1); } } struct dirent *entry; // has two important members (d-type)-tells me if its a […]

c将几个参数传递给线程

当我创建一个线程时,我想传递几个参数。 所以我在头文件中定义以下内容: struct data{ char *palabra; char *directorio; FILE *fd; DIR *diro; struct dirent *strdir; }; 在.c文件中,我执行以下操作 if (pthread_create ( &thread_id[i], NULL, &hilos_hijos, ??? ) != 0){ perror(“Error al crear el hilo. \n”); exit(EXIT_FAILURE); } 我如何将所有这些参数传递给线程。 我虽然说: 1)首先使用malloc为此结构分配内存,然后为每个参数赋值: struct data *info info = malloc(sizeof(struct data)); info->palabra = …; 2)定义 struct data info info.palabra = … […]

私有子句中的变量与OpenMP中并行区域中定义的变量之间是否存在任何差异?

我想知道是否有任何理由更喜欢OpenMP中的private(var)子句超过(私有)变量的本地定义,例如 int var; #pragma omp parallel private(var) { … } 与 #pragma omp parallel { int var; … } 另外,我想知道私人条款的重点是什么。 这个问题已在OpenMP中解释过:局部变量是否自动私有? ,但我确信答案是错的 我不喜欢答案,因为即使C89不阻止你在函数中间定义变量,只要它们在作用域的开头(这是自动的输入并行区域时的情况)。 因此,即使对于老式的C程序员来说,这也不应该有任何区别。 我是否应该将其视为语法糖,它允许在过去的好日子里使用“定义变量 – 在你的function中开始”的风格? 顺便说一下:在我看来,第二个版本也阻止程序员在并行区域之后使用私有变量,希望它可能包含一些有用的东西,所以另一个-1用于private子句。 但是因为我对OpenMP很陌生,所以如果没有对它进行很好的解释,我不想怀疑它。 提前谢谢你的答案!

在C / C ++中产生线程的跨平台方式?

在C和C ++中是否有一种产生线程的跨平台方式? 像sched_yield()或Sleep(0)之类的东西? SDL_Delay(0)总是会产生或在某些实现中立即返回吗?

使用volatile作为primefaces

如果我有这样的东西…… volatile long something_global = 0; long some_public_func() { return something_global++; } 当使用多个线程访问时,期望此代码不会中断(竞争条件)是否合理? 如果它不是标准的,它仍然可以作为现代编译器的合理假设吗? 注意:所有我使用它的原因是primefaces增量和减量 – 没什么比这更好的了。

线程无法计数,给出错误的结果

我写了这段代码 #include /* Input/Output */ #include /* General Utilities */ #include /* POSIX Threads */ unsigned int cnt=0; /*Count variable%*/ const int NITERS=1000; void count() { int i=0; for(i=0; i<NITERS; i++) { cnt++; } pthread_exit(0); } int main() { pthread_t tid1,tid2; /* create threads 1 and 2 */ pthread_create(&tid1,NULL,count,NULL); pthread_create(&tid2,NULL,count,NULL); /* Main block now waits […]

虚假共享和primefaces变量

当不同的变量位于同一个缓存行中时,您可能会遇到False Sharing ,这意味着即使两个不同的线程(在不同的核心上运行)正在访问两个不同的变量,如果这两个变量位于同一个缓存行中,您将拥有性能命中,因为每次都会触发缓存一致性。 现在说这些变量是primefaces变量(primefaces我指的是引入内存栅栏的变量,比如C ++的atomic ),会在那里进行虚假共享,或者primefaces变量是否在同一个缓存行中并不重要或者不是,据说他们无论如何都会引入缓存一致性。 换句话说,将primefaces变量放在同一个缓存行中会使应用程序变慢而不是将它们放在同一个缓存行中吗?

pthread_cond_wait()总能赢得锁定互斥锁的竞争吗?

这个问题与llnl中的pthread教程有关 。 说有三个主题。 线程1: pthread_mutex_lock(&mutex) do_something… if condition pthread_cond_signal(&con) pthread_mutex_unlock(&mutex) repeat 线程2: pthread_mutex_lock(&mutex) do_something… if condition pthread_cond_signal(&con) pthread_mutex_unlock(&mutex) repeat 线程3: pthread_mutex_lock(&mutex) while(condition not holds) pthread_cond_wait(&con) do_something… pthread_mutex_unlock(&mutex) 假设Thread1检查条件是否满足,然后发送信号以唤醒Thread3 。 最后它解锁了互斥锁。 但与此同时, 线程2正试图锁定互斥锁。 我的问题是:有没有保证Thread3将永远在竞争中获胜? 如果没有,则在Thread2 do_something …之后,可以更改条件变量,然后当Thread3锁定互斥锁时,条件变量与预期的不同。

线程终止问题(c编程)

我正在使用C语言编写一个使用multithreading的Linux应用程序。 由main函数生成的线程完成大部分工作,因此通常最后完成。 我看到一些奇怪的行为,我相信这是由于主线程在生成的线程有机会完成其工作之前终止。 这里有一些示例代码来说明我在说什么: #define _POSIX_C_SOURCE 200112L #define _ISOC99_SOURCE #define __EXTENSIONS__ #define _GNU_SOURCE #include #include void my_cleanup(void *arg) { printf(“cleanup: %s\n”, (char *)arg); } void * thread_stuff(void *arg) { printf(“thread started\n”); pthread_cleanup_push(cleanup, “running”); if (arg) pthread_exit((void *)2); pthread_cleanup_pop(0); pthread_exit((void *)2); } int main() { int err; pthread_t tid1, tid2; err = pthread_create(&tid1, NULL, thread_stuff, (void […]