条件变量有两个属性:进程共享属性、时钟属性。
(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;
}