Tag: multithreading

使用线程发现CPU核心数

我有一个任务,我必须在Linux上编写一个C程序(我使用CentOS),它使用线程/进程来确定CPU的内核数量。 首先,我尝试以毫微微/微秒的速度打印当前时间,因为我知道可以运行1thread / core(或者使用HT)。 但是通过毫秒,超过10个线程打印相同的时间和微秒没有一个是相同的。 其次我尝试用时钟测量线程的执行时间,假设我有4个内核,同时4个线程的执行时间应该几乎和执行1一样长。但是我的程序都不能让我更接近数字CPU的。 你能帮我一些建议吗? 程序打印当前时间: pthread_t th[N]; void* afis () { //time_t now; //time(&now); //printf(“%s”, ctime(&now)); struct timeval start, end; long mtime, seconds, useconds; gettimeofday(&start, NULL); // usleep(2000); gettimeofday(&end, NULL); seconds = end.tv_sec – start.tv_sec; useconds = end.tv_usec – start.tv_usec; mtime = seconds + useconds; printf(“Thread with TID:%d Elapsed time: %ld microsecons\n”,(unsigned […]

无法正确创建线程

谁能告诉我我做错了什么? (我省略了程序的其余部分,因为它很长……) #include void *RTPfun(char *client_addr); int main(int argc, char *argv[]) { char* client_addr; pthread_t RTPthread; // … pthread_create(&RTPthread, NULL, &RTPfun, client_addr) } void *RTPfun(char * client_addr) { // … return; } 错误: TCPserver.c:在函数’main’中: TCPserver.c:74:5:警告:从不兼容的指针类型[默认启用]传递’pthread_create’的参数3 /usr/include/pthread.h:225:12:注意:预期’void *(*)(void *)’但参数的类型为’void *(*)(char *)’

C:如何安全正确地将多个参数传递给pthread?

考虑这个简单的代码: void* threadFunction(void* arg) { int argument=(int)arg; printf(“%d recieved\n”, argument); return NULL; } int main(int argv, char* argc[]) { int error; int i=0; pthread_t thread; int argument_to_thread=0; if ((error=pthread_create(&thread, NULL, threadFunction, (void*)argument_to_thread))!=0) { printf(“Can’t create thread: [%s]\n”, strerror(error)); return 1; } pthread_join(thread, NULL); return 0; } 这有效,但这里有两件事让我烦恼。 首先,我想向threadFunction()发送多个参数。 当然,我可以传递指向数组的指针,但是如果我想传递两个不同类型的参数呢? (说一个int和char* )怎么做? 在这里困扰我的第二件事是我在编译上面时得到的警告…… test2.c: In function […]

将int作为C中pthread_create中的第4个参数传递

int threadreader(void* pos) { int a, v; char *f; v = (long int) *pos; f = (char *)malloc(sizeof(SIZEFICHEIRO)); a = randomnum(4); f = pickfile(a, f); return reader (v, f); } int main(){ int i, pos, extra, retval,safe; pthread_t thread[K]; for (i = 0; i < K; i++) { pos = i * L/K * SIZECADEIA; […]

如何从主线程唤醒睡眠线程?

我有一个捕获程序,此外捕获数据并将其写入文件还打印一些统计信息。打印统计信息的function static void report(void) { /*Print statistics*/ } 使用每秒过期的ALARM大致每秒调用一次。所以程序就像 void capture_program() { pthread_t report_thread while() { if(pthread_create(&report_thread,NULL,report,NULL)){ fprintf(stderr,”Error creating reporting thread! \n”); } /* Capturing code ————– ————– */ if(doreport) /*wakeup the sleeping thread.*/ } } void *report(void *param) { //access some register from hardware //sleep for a second } 计时器到期时设置doreport标志。如果设置了此标志,则调用report()来清除该标志。 当计时器在主线程中关闭时,如何唤醒睡眠线程(运行report())?

实现multithreadingUDP服务器的问题(线程池?)

我正在写一个音频流(客户端 – 服务器)作为我的项目(C / C ++),我决定为这个项目制作一个multithreadingUDP服务器。 这背后的逻辑是每个客户端将在他自己的线程中处理。 我遇到的问题是线程相互干扰。 我的服务器做的第一件事就是创建一种线程池; 它创建了5个线程,所有线程都被recvfrom()函数自动阻止,虽然看起来,在我将多个线程连接到服务器的大多数情况下,多个线程正在响应,之后导致服务器变为完全阻止而不是进一步操作。 调试这个也很困难所以我写这里是为了获得一些关于multithreadingUDP服务器通常实现的建议。 我应该在部分代码中使用互斥锁或信号量吗? 如果是这样,在哪里? 任何想法都会非常有帮助。

为什么在setjmp()中调用函数会发生分段错误?

我不明白为什么在函数middleFunc() ,当在if ( setjmp(middle) )语句if ( setjmp(middle) )调用entry_point(arg)时,会出现分段错误。 #include #include jmp_buf start,middle,end; void finalFunc(void *v) { printf(“hello\n”); return ; } void middleFunc(void (*entry_point)(void *), void *arg) { //just debug : this does not cause segmentation fault entry_point(arg); if ( setjmp(middle) ){ //this casues the segmentation fault entry_point(arg); //once the entry point (finalFunc) is executed go […]

如何通过引用pthread启动例程来传递顺序计数器?

下面是我的C代码,用于打印增加的全局计数器,每个线程一个增量。 #include #include static pthread_mutex_t pt_lock = PTHREAD_MUTEX_INITIALIZER; int count = 0; int *printnum(int *num) { pthread_mutex_lock(&pt_lock); printf(“thread:%d “, *num); pthread_mutex_unlock(&pt_lock); return NULL; } int main() { int i, *ret; pthread_t pta[10]; for(i = 0; i < 10; i++) { pthread_mutex_lock(&pt_lock); count++; pthread_mutex_unlock(&pt_lock); pthread_create(&pta[i], NULL, (void *(*)(void *))printnum, &count); } for(i = 0; i < […]

线程外部终止时的NetServerEnum块

(使用VS2010在C环境中使用Win32 api) 我有一个双线程的应用程序。 第一个线程分叉第二个线程并等待给定的间隔 – “TIMEOUT”,然后在其上调用TerminateThread() 。 同时,第二个线程调用NetServerEnum() 。 看来,当达到超时时,无论NetServerEnum是否成功返回,第一个线程都会死锁。 我已经注意到NetServerEnum创建了自己的工作线程。 我最终得到了死锁中的其中一个线程,通常是在ntdll.dll!RtlInitializeExceptionChain ,无法正常退出我的进程。

使用GCC和OMP在C中的特定线程顺序

我需要组建4个团队,每个团队有4个线程,每个团队都有连续的处理器。 我期待的结果是,例如: Team 0 Thread 0 Processor: 0 Team 0 Thread 1 Processor: 1 Team 0 Thread 2 Processor: 2 Team 0 Thread 3 Processor: 3 Team 1 Thread 0 Processor: 4 Team 1 Thread 1 Processor: 5 Team 1 Thread 2 Processor: 6 Team 1 Thread 3 Processor: 7 Team 2 Thread 0 Processor: […]