如何使Linux下的一个线程暂停几秒?

如何使Linux下的一个线程暂停几秒?,第1张

你是做实验了还是看书了,哪里说sleep会导致其他线程休眠呢?(windows下MFC里面随意sleep似乎会导致这样?)

下面的短程序拿回去编译下,就知道到底sleep会不会使得其他线程也休眠了。

pthread_cond_wait当然可以使得线程休眠,只是你还得在另外一个线程中使得pthread_cond_wait的等待的条件满足才可以使得介个线程返回,不觉得单纯为了等待多开一个线程会很麻烦?那你愿意别的方式也可以阿...POSIX的互斥、信号量都能控制线程,不是简单的等待功能。

#include <stdio.h>

#include <stdlib.h>

#include <pthread.h>

void thread1(void)

{

int i=0

while(i<10)

{

sleep(3)

printf("t1\n")

fflush(stdout)

i++

}

}

void thread2(void)

{

int i=0

while(i<10)

{

sleep(1)

printf("t2\n")

fflush(stdout)

i++

}

}

int main()

{

pthread_t t1,t2

pthread_create(&t1,NULL,(void*)thread1,NULL)

pthread_create(&t2,NULL,(void*)thread2,NULL)

pthread_join(t1,NULL)

pthread_join(t2,NULL)

return 0

}

大概的介绍一下Linux 的指定CPU运行,包括进程和线程。linux下的top命令是可以查看当前的cpu的运行状态,按1可以查看系统有多少个CPU,以及每个CPU的运行状态。

可是如何查看线程的CPU呢?top

-Hp pid,pid就是你当前程序的进程号,如果是多线程的话,是可以查看进程内所有线程的CPU和内存使用情况。

pstree可以查看主次线程,同样的pstree -p pid。可以查看进程的线程情况。

taskset这个其实才是重点,可以查看以及设置当前进程或线程运行的CPU(设置亲和力)。

taskset -pc pid,查看当前进程的cpu,当然有的时候不只是一个,taskset -pc cpu_num pid ,cpu_num就是设置的cpu。

这样的话基本的命令和 *** 作其实大家都知道了,接下来就是在代码中完成这些 *** 作,并通过命令去验证代码的成功率。

进程制定CPU运行:

[cpp] view plain copy

#include<stdlib.h>

#include<stdio.h>

#include<sys/types.h>

#include<sys/sysinfo.h>

#include<unistd.h>

#define __USE_GNU

#include<sched.h>

#include<ctype.h>

#include<string.h>

int main(int argc, char* argv[])

{

//sysconf获取有几个CPU

int num = sysconf(_SC_NPROCESSORS_CONF)

int created_thread = 0

int myid

int i

int j = 0

//原理其实很简单,就是通过cpu_set_t进行位与 *** 作

cpu_set_t mask

cpu_set_t get

if (argc != 2)

{

printf("usage : ./cpu num\n")

exit(1)

}

myid = atoi(argv[1])

printf("system has %i processor(s). \n", num)

//先进行清空,然后设置掩码

CPU_ZERO(&mask)

CPU_SET(myid, &mask)

//设置进程的亲和力

if (sched_setaffinity(0, sizeof(mask), &mask) == -1)

{

printf("warning: could not set CPU affinity, continuing...\n")

}

while (1)

{

CPU_ZERO(&get)

//获取当前进程的亲和力

if (sched_getaffinity(0, sizeof(get), &get) == -1)

{

printf("warning: cound not get cpu affinity, continuing...\n")

}

for (i = 0i <numi++)

{

if (CPU_ISSET(i, &get))

{

printf("this process %d is running processor : %d\n",getpid(), i)

}

}

}

return 0

}

进程设置CPU运行,其实只能是单线程。多线程设定CPU如下:

[cpp] view plain copy

#define _GNU_SOURCE

#include <stdio.h>

#include <stdlib.h>

#include <string.h>

#include <unistd.h>

#include <pthread.h>

#include <sched.h>

void *myfun(void *arg)

{

cpu_set_t mask

cpu_set_t get

char buf[256]

int i

int j

//同样的先去获取CPU的个数

int num = sysconf(_SC_NPROCESSORS_CONF)

printf("system has %d processor(s)\n", num)

for (i = 0i <numi++) {

CPU_ZERO(&mask)

CPU_SET(i, &mask)

//这个其实和设置进程的亲和力基本是一样的

if (pthread_setaffinity_np(pthread_self(), sizeof(mask), &mask) <0) {

fprintf(stderr, "set thread affinity failed\n")

}

CPU_ZERO(&get)

if (pthread_getaffinity_np(pthread_self(), sizeof(get), &get) <0) {

fprintf(stderr, "get thread affinity failed\n")

}

for (j = 0j <numj++)

{

if (CPU_ISSET(j, &get))

{

printf("thread %d is running in processor %d\n", (int)pthread_self(), j)

}

}

j = 0

while (j++ <100000000) {

memset(buf, 0, sizeof(buf))

}

}

pthread_exit(NULL)

}

int main(int argc, char *argv[])

{

pthread_t tid

if (pthread_create(&tid, NULL, (void *)myfun, NULL) != 0)

{

fprintf(stderr, "thread create failed\n")

return -1

}

pthread_join(tid, NULL)

return 0

}

姓名:王央京    学号:18050100052   学院:电子工程学院

转自:https://blog.csdn.net/qq_22847457/article/details/89371217

【嵌牛导读】本文介绍了Linux线程的相关信息

【嵌牛鼻子】Linux线程

【嵌牛提问】在了解Linux系统后,能否具体介绍线程的概念?

【嵌牛正文】

类Unix系统中,早期是没有“线程”概念的,80年代才引入,借助进程机制实现出了线程的概念。因此在这类系统中,进程和线程关系密切。一个进程可以有多个线程,这个进程本身也叫做线程只不过是主线程。通常主线程分配任务给子线程做。程序设计时候就可以某一时刻不止做一件事情,每一个线程处理各自独立的任务。

多个线程可以访问相同的存储地址空间和文件描述符。同一进程内的线程共享以下数据:全局内存、进程指令、打开的文件、信号处理函数和信号处置、当前工作目录、用户ID和用户组ID、大多数数据。每个线程有各自的线程ID、寄存器集合(包括程序计数器和栈指针)、栈、errono、信号掩码、优先级。

线程的优点有提高程序并发性、开销小和数据通信、共享数据方便等。线程的缺点有库函数不稳定、调试编写困难、gdb不支持、对信号支持不好等。除此之外,多线程内如果其中一个线程出现了 除0、野指针 等问题会造成该线程崩溃,进而导致整个进程终止。同时,线程是进程的执行分支,线程出异常,就类似进程出异常,进而触发信号机制,终止进程,进程终止,该进程内的所有线程也就随即退出。

从上述分析来看,线程的优点相对突出,缺点均不是硬伤。Linux下由于实现方法导致进程、线程差别不是很大。

线程有一套完整的与其有关的函数库调用,它们中的绝大多数函数名都以pthread_开头。为了使用这些函数库调用,我们必须定义宏_REENTRANT,在程序中包含头文件pthread.h,并且在编译程序时需要用选项-lpthread来链接线程库。其中常用的函数库如下:

1.  pthread_self函数获取线程ID,其作用对应进程中getpid()函数。

2.  pthread_create函数创建一个新线程,其作用对应进程中fork()函数。

3.  pthread_exit函数将单个线程退出,其作用对应进程中exit()函数

4.  pthread_join函数阻塞等待线程退出,获取线程退出状态其作用,对应进程中waitpid()函数。

5.  pthread_cancel函数杀死(取消)线程其作用,对应进程中kill()函数。

6.  pthread_detach函数实现线程分离。


欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/yw/7249150.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-04-03
下一篇 2023-04-03

发表评论

登录后才能评论

评论列表(0条)

保存