您当前的位置:首页 > 精选知识 > 正文

linux多线程编程实例(Linux 的多线程编程中,如何给线程发信号)

本文目录

  • Linux 的多线程编程中,如何给线程发信号
  • linux下多进程或者多线程编程的问题新手,望指教!
  • Linux多线程编程
  • linux里面多线程编程问题

Linux 的多线程编程中,如何给线程发信号

不管是在进程还是线程,很多时候我们都会使用一些定时器之类的功能,这里就定时器在多线程的使用说一下。首先在linux编程中定时器函数有alarm()和setitimer(),alarm()可以提供一个基于秒的定时功能,而setitimer可以提供一个基于微妙的定时功能。alarm()原型:#include 《unistd.h》unsigned int alarm(unsigned int seconds);这个函数在使用上很简单,第一次调用这个函数的时候是设置定时器的初值,下一次调用是重新设置这个值,并会返回上一次定时的剩余时间。setitimer()原型:#include 《sys/time.h》int setitimer(int which, const struct itimerval *value,struct itimerval *ovalue);这个函数使用起来稍微有点说法,首先是第一个参数which的值,这个参数设置timer的计时策略,which有三种状态分别是:ITIMER_REAL:使用系统时间来计数,时间为0时发出SIGALRM信号,这种定时能够得到一个精准的定时,当然这个定时是相对的,因为到了微秒级别我们的处理器本身就不够精确。ITIMER_VIRTUAL:使用进程时间也就是进程分配到的时间片的时间来计数,时间为0是发出SIGVTALRM信号,这种定时显然不够准确,因为系统给进程分配时间片不由我们控制。ITIMER_PROF:上面两种情况都能够触发第二个参数参数value涉及到两个结构体:struct itimerval {struct timeval it_interval; /* next value */struct timeval it_value; /* current value */};struct timeval {long tv_sec; /* seconds */long tv_usec; /* microseconds */};在结构体itimerval中it_value是定时器当前的值,it_interval是当it_value的为0后重新填充的值。而timeval结构体中的两个变量就简单了一个是秒一个是微秒。上面是这两个定时函数的说明,这个函数使用本不是很难,可以说是很简单,但是碰到具体的应用的时候可能就遇到问题了,在多进程编程中使用一般不会碰到什么问题,这里说的这些问题主要体现在多线程编程中。比如下面这个程序:#include 《pthread.h》#include 《signal.h》#include 《stdio.h》#include 《stdlib.h》#include 《unistd.h》#include 《sys/time.h》void sig_handler(int signo){alarm(2);printf(“alarm signal\n“);}void *pthread_func(){alarm(2);while(1){pause();}}int main(int argc, char **argv){pthread_t tid;int retval;signal(SIGALRM, sig_handler);if((retval = pthread_create(&tid, NULL, pthread_func, NULL)) 《 0){perror(“pthread_create“);exit(-1);}while(1){printf(“main thread\n“);sleep(10);}return 0;}这个程序的理想结果是:main threadalarm signalalarm signalalarm signalalarm signalalarm signalmain thread可事实上并不是这样的,它的结果是:main pthreadalarm signalmain pthreadalarm signalmain pthread

linux下多进程或者多线程编程的问题新手,望指教!

第一个问题,不管是创建进程或者创建线程都不会阻塞,创建完毕马上返回不会等待子进程或者子线程的运行第二个问题首先进程和线程是不一样的多进程时,父进程如果先结束,那么子进程会被init进程接收成为init进程的子进程,接下来子进程接着运行,直到结束,init进程负责取得这些子进程的结束状态并释放进程资源。而如果是子进程先结束,那么父进程应当用wait或者waitpid去获取子进程的结束状态并释放进程资源,否则子进程会成为僵死进程,它占用的进程资源不会释放多线程时,如果父线程或者说你讲的main结束时使用return或者exit或者处理完毕结束,那么整个进程都结束,其他子线程自然结束。如果main结束时使用的是pthread_exit那么只有父线程结束,子线程还在运行。同样对于子线程结束时如果调用了exit,那么整个进程包括父线程结束,如果调用了pthread_exit或者正常结束,那么只有子线程结束。另外子线程结束时如果没有分离属性,其他线程应当使用pthread_join去获取线程结束状态并释放线程资源,如同进程里的wait和waitpid

Linux多线程编程

程序代码test.c共两个线程,一个主线程,一个读缓存区的线程:#include 《pthread.h》#include 《stdio.h》#include 《stdlib.h》#include 《string.h》#include 《unistd.h》char globe_buffer; void *read_buffer_thread(void *arg); //这里先声明一下读缓存的线程,具体实现写在后面了 int main() { int res,i; pthread_t read_thread; for(i=0;i《20;i++) globe_buffer[i]=i; printf(“\nTest thread : write buffer finish\n“); sleep(3);\\这里的3秒是多余,可以不要。 res = pthread_create(&read_thread, NULL, read_buffer_thread, NULL); if (res != 0) { printf(“Read Thread creat Error!“); exit(0); } sleep(1); printf(“waiting for read thread to finish...\n“); res = pthread_join(read_thread, NULL); if (res != 0) { printf(“read thread join failed!\n“); exit(0); } printf(“read thread test OK, have fun!! exit ByeBye\n“); return 0;} void *read_buffer_thread(void *arg){ int i,x; printf(“Read buffer thread read data : \n“); for(i=0;i《20;i++) { x=globe_buffer[i]; printf(“%d “,x); globe_buffer[i]=0;//清空 } printf(“\nread over\n“);}---------------------------------------------------------------------------------以上程序编译:gcc -D_REENTRANT test.c -o test.o –lpthread运行这个程序:$ ./test.o:

linux里面多线程编程问题

mutex是线程锁,多个线程运行,当遇到临界资源,基本上是全局变量时,需要顺序的操作这些资源,不能都去操作,就像数据库里面的原子操作,所以需要用一个锁来同步这些线程,让他们一个一个的来,谁获得锁,谁有权操作。pthread_mutex_init是对锁进行初始化,一个参数是锁结构体,一个是属性,属性基本为NULL就行。pthread_mutex_lock用来加锁,加锁后,别的线程运行到这个地方就不能继续运行了,等待解锁。pthread_mutex_unlock用来解锁。pthread_mutex_destroy用来销毁锁。


声明:本文版权归原作者所有,转载文章仅为传播更多信息之目的,如作者信息标记有误,请第一时间联系我们修改或删除,谢谢。

上一篇: 4月起将正式实施一批交通新规,交通新规2023年扣分新规定全文(生母为了她放弃生命56岁因癌症异国去世)

下一篇: 电脑怎么看什么系统?电脑系统是什么



推荐阅读