条件变量属性----时钟属性

条件变量有两个属性:进程共享属性、时钟属性。
(1)进程共享属性
	条件变量与互斥量的共享属性的用法一样
	int pthread_condattr_init(pthread_condattr_t *attr);
	int pthread_condattr_destroy(pthread_condattr_t *attr);
	int pthread_condattr_getpshared(const pthread_condattr_t *attr, int *pshared);
	int pthread_condattr_setpshared(pthread_condattr_t *attr, int pshared);
	
(2)时钟属性
	1.设置时钟属性决定pthread_cond_timedwait函数的时钟参数使用何种时钟。
		// 图6-8
		CLOCK_REALTIME				// 实时系统时间
		CLOCK_MONONIC				// 不带负跳数的实时系统时间
		CLOCK_PROCESS_CPUTIME_ID	// 调用进程的CPU时间
		CLOCK_THREAD_CPUTIME_ID		// 调用线程的CPU时间
		
		
	2.在使用pthread_cond_timedwait前要先设置条件变来个的时钟属性
		int pthread_condattr_getclock(const pthread_condattr_t *attr, clockid_t *id);
		int pthread_condattr_setclock(pthread_condattr_t *attr, clockid_t id);

#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include <stdbool.h>
#include <unistd.h>
#include <fcntl.h>
#include <assert.h>
#include <sys/wait.h>
#include <sys/acct.h>
#include <errno.h>
#include <sys/times.h>
#include <pthread.h>
#include <signal.h>

/*
CLOCK_REALTIME				// 实时系统时间
CLOCK_MONONIC				// 不带负跳数的实时系统时间
CLOCK_PROCESS_CPUTIME_ID	// 调用进程的CPU时间
CLOCK_THREAD_CPUTIME_ID 	// 调用线程的CPU时间
*/

/*
	测试结果
	id = CLOCK_REALTIME
	id = CLOCK_REALTIME
	ERROR:set CLOCK_MONOTONIC
	id = CLOCK_MONOTONIC
	id = CLOCK_MONOTONIC
	id = CLOCK_MONOTONIC
*/
/*
	测试分析
	1.系统默认LOCK_REALTIME
	2.CLOCK_REALTIME设置正常
	3.CLOCK_MONOTONIC设置失败
	4.CLOCK_PROCESS_CPUTIME_ID和CLOCK_THREAD_CPUTIME_ID设置成功,但设置后获取到的结果为CLOCK_MONOTONIC
	
 */


void print_clkid(clockid_t id)
{
	if (CLOCK_REALTIME == id)
		printf("id = CLOCK_REALTIME\n");
	else if (CLOCK_MONOTONIC == id)
		printf("id = CLOCK_MONOTONIC\n");
	else if (CLOCK_PROCESS_CPUTIME_ID == id)
		printf("id = CLOCK_PROCESS_CPUTIME_ID\n");
	else if (CLOCK_THREAD_CPUTIME_ID == id)
		printf("id = CLOCK_THREAD_CPUTIME_ID\n");
	else
		printf("clkid undefined\n");
	return;
}
int main()
{
	pthread_condattr_t attr;
	clockid_t clkid;
	
	pthread_condattr_init(&attr);
	
	pthread_condattr_getclock(&attr, &clkid);
	print_clkid(clkid);	// CLOCK_REALTIME
	
	if (0 != pthread_condattr_setclock(&attr, CLOCK_REALTIME))	// 实时系统时间
		printf("ERROR:set CLOCK_REALTIME\n");
	pthread_condattr_getclock(&attr, &clkid);
	print_clkid(clkid);	// CLOCK_REALTIME

	if (0 == pthread_condattr_setclock(&attr, CLOCK_MONOTONIC))	// 不带负跳数的实时系统时间
		printf("ERROR:set CLOCK_MONOTONIC\n"); // ERROR:set CLOCK_MONOTONIC
	pthread_condattr_getclock(&attr, &clkid);
	print_clkid(clkid); // CLOCK_MONOTONIC
	
	if(0 == pthread_condattr_setclock(&attr, CLOCK_PROCESS_CPUTIME_ID))	// 调用进程的CPU时间
		printf("ERROR:set CLOCK_PROCESS_CPUTIME_ID\n");
	pthread_condattr_getclock(&attr, &clkid);
	print_clkid(clkid);	// CLOCK_MONOTONIC

	if(0 == pthread_condattr_setclock(&attr, CLOCK_THREAD_CPUTIME_ID))	// 调用线程的CPU时间
		printf("ERROR:set CLOCK_THREAD_CPUTIME_ID\n");
	pthread_condattr_getclock(&attr, &clkid);
	print_clkid(clkid);	// CLOCK_MONOTONIC
	
	return 0;
}



 

  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值