POSIX风格的条件变量机制。
条件变量是一种同步机制,允许任务挂起执行,直到满足对某些任意共享数据的某种谓词。
对条件的基本操作是:信号条件(当谓词变为真时),以及等待条件,阻塞任务执行,直到另一个任务信号条件。条件变量必须始终与互斥量关联,以避免一种众所周知的竞态条件,即一个任务准备等待条件变量,另一个任务在第一个任务实际等待它之前就信号条件。
int rt_cond_bind (RT_COND *cond, const char *name, RTIME timeout);
绑定到一个条件变量。
此例程创建一个新的描述符,以引用由其符号名标识的现有条件变量。如果对象在入口处不存在,调用者可能会阻塞,直到创建了给定名称的条件变量。
参数
返回值
成功时返回零。否则:
标签
xthread-nowait
, switch-primary
注意
超时值被解释为 Alchemy 时钟分辨率的倍数(参见 alchemy-clock-resolution 选项,默认为1纳秒)。
示例代码
#include <stdio.h>
#include <stdlib.h>
#include <alchemy/task.h>
#include <alchemy/mutex.h>
#include <alchemy/cond.h>
#define TASK_STACK_SIZE 0 // 使用默认栈大小
#define TASK_PRIORITY 50 // 中等优先级
RT_TASK producer_task, consumer_task, another_task;
RT_MUTEX mutex;
RT_COND cond;
int shared_data = 0;
int data_ready = 0;
int data_ready_another = 0;
void producer(void *arg)
{
rt_task_sleep(1000000000); // 睡眠1秒
while (shared_data < 5) {
rt_mutex_acquire(&mutex, TM_INFINITE);
shared_data++;
printf("Producer: produced data %d\n", shared_data);
data_ready = 1;
data_ready_another = 1;
rt_cond_broadcast(&cond);
rt_mutex_release(&mutex);
rt_task_sleep(1000000000); // 睡眠1秒
}
}
void consumer(void *arg)
{
while (shared_data < 5) {
rt_mutex_acquire(&mutex, TM_INFINITE);
while (!data_ready) {
rt_cond_wait(&cond, &mutex, TM_INFINITE);
}
printf("Consumer: consumed data %d\n", shared_data);
data_ready = 0;
rt_mutex_release(&mutex);
}
}
void another_consumer(void *arg)
{
RT_COND cond_bind;
int ret = rt_cond_bind(&cond_bind, "example_cond",TM_INFINITE);
if (ret) {
fprintf(stderr, "Failed to create condition variable: %s\n", strerror(-ret));
return;
}
while (shared_data < 5) {
rt_mutex_acquire(&mutex, TM_INFINITE);
while (!data_ready_another) {
rt_cond_wait(&cond_bind, &mutex, TM_INFINITE);
}
printf("Another_Consumer: consumed data %d\n", shared_data);
data_ready_another = 0;
rt_mutex_release(&mutex);
}
rt_cond_unbind(&cond_bind);
}
int main(int argc, char *argv[])
{
int ret;
// 创建互斥锁
ret = rt_mutex_create(&mutex, "example_mutex");
if (ret) {
fprintf(stderr, "Failed to create mutex: %s\n", strerror(-ret));
return EXIT_FAILURE;
}
// 创建条件变量
ret = rt_cond_create(&cond, "example_cond");
if (ret) {
fprintf(stderr, "Failed to create condition variable: %s\n", strerror(-ret));
rt_mutex_delete(&mutex);
return EXIT_FAILURE;
}
// 创建生产者任务
ret = rt_task_create(&producer_task, "producer", TASK_STACK_SIZE, TASK_PRIORITY, T_JOINABLE);
if (ret) {
fprintf(stderr, "Failed to create producer task: %s\n", strerror(-ret));
rt_cond_delete(&cond);
rt_mutex_delete(&mutex);
return EXIT_FAILURE;
}
// 创建消费者任务
ret = rt_task_create(&consumer_task, "consumer", TASK_STACK_SIZE, TASK_PRIORITY, T_JOINABLE);
if (ret) {
fprintf(stderr, "Failed to create consumer task: %s\n", strerror(-ret));
rt_task_delete(&producer_task);
rt_cond_delete(&cond);
rt_mutex_delete(&mutex);
return EXIT_FAILURE;
}
// 创建另一个消费者任务
ret = rt_task_create(&another_task, "another_consumer", TASK_STACK_SIZE, TASK_PRIORITY, T_JOINABLE);
if (ret) {
fprintf(stderr, "Failed to create consumer task: %s\n", strerror(-ret));
rt_task_delete(&consumer_task);
rt_task_delete(&producer_task);
rt_cond_delete(&cond);
rt_mutex_delete(&mutex);
return EXIT_FAILURE;
}
// 启动任务
rt_task_start(&producer_task, &producer, NULL);
rt_task_start(&consumer_task, &consumer, NULL);
rt_task_start(&another_task, &another_consumer, NULL);
rt_task_join(&producer_task);
rt_task_join(&consumer_task);
rt_task_join(&another_task);
rt_cond_delete(&cond);
rt_mutex_delete(&mutex);
return EXIT_SUCCESS;
}
int rt_cond_broadcast (RT_COND *cond);
广播一个条件变量。
所有当前等待条件变量的任务都会立即解除阻塞。
参数
返回值
成功时返回零。否则:
标签
unrestricted
, switch-primary
示例代码
#include <stdio.h>
#include <stdlib.h>
#include <alchemy/task.h>
#include <alchemy/mutex.h>
#include <alchemy/cond.h>
#define TASK_STACK_SIZE 0 // 使用默认栈大小
#define TASK_PRIORITY 50 // 中等优先级
RT_TASK producer_task, consumer_task, another_task;
RT_MUTEX mutex;
RT_COND cond;
int shared_data = 0;
int data_ready = 0;
int data_ready_another = 0;
void producer(void *arg)
{
rt_task_sleep(1000000000); // 睡眠1秒
while (shared_data < 5) {
rt_mutex_acquire(&mutex, TM_INFINITE);
shared_data++;
printf("Producer: produced data %d\n", shared_data);
data_ready = 1;
data_ready_another = 1;
rt_cond_broadcast(&cond);
rt_mutex_release(&mutex);
rt_task_sleep(1000000000); // 睡眠1秒
}
}
void consumer(void *arg)
{
while (shared_data < 5) {
rt_mutex_acquire(&mutex, TM_INFINITE);
while (!data_ready) {
rt_cond_wait(&cond, &mutex, TM_INFINITE);
}
printf("Consumer: consumed data %d\n", shared_data);
data_ready = 0;
rt_mutex_release(&mutex);
}
}
void another_consumer(void *arg)
{
RT_COND cond_bind;
int ret = rt_cond_bind(&cond_bind, "example_cond",TM_INFINITE);
if (ret) {
fprintf(stderr, "Failed to create condition variable: %s\n", strerror(-ret));
return;
}
while (shared_data < 5) {
rt_mutex_acquire(&mutex, TM_INFINITE);
while (!data_ready_another) {
rt_cond_wait(&cond_bind, &mutex, TM_INFINITE);
}
printf("Another_Consumer: consumed data %d\n", shared_data);
data_ready_another = 0;
rt_mutex_release(&mutex);
}
rt_cond_unbind(&cond_bind);
}
int main(int argc, char *argv[])
{
int ret;
// 创建互斥锁
ret = rt_mutex_create(&mutex, "example_mutex");
if (ret) {
fprintf(stderr, "Failed to create mutex: %s\n", strerror(-ret));
return EXIT_FAILURE;
}
// 创建条件变量
ret = rt_cond_create(&cond, "example_cond");
if (ret) {
fprintf(stderr, "Failed to create condition variable: %s\n", strerror(-ret));
rt_mutex_delete(&mutex);
return EXIT_FAILURE;
}
// 创建生产者任务
ret = rt_task_create(&producer_task, "producer", TASK_STACK_SIZE, TASK_PRIORITY, T_JOINABLE);
if (ret) {
fprintf(stderr, "Failed to create producer task: %s\n", strerror(-ret));
rt_cond_delete(&cond);
rt_mutex_delete(&mutex);
return EXIT_FAILURE;
}
// 创建消费者任务
ret = rt_task_create(&consumer_task, "consumer", TASK_STACK_SIZE, TASK_PRIORITY, T_JOINABLE);
if (ret) {
fprintf(stderr, "Failed to create consumer task: %s\n", strerror(-ret));
rt_task_delete(&producer_task);
rt_cond_delete(&cond);
rt_mutex_delete(&mutex);
return EXIT_FAILURE;
}
// 创建另一个消费者任务
ret = rt_task_create(&another_task, "another_consumer", TASK_STACK_SIZE, TASK_PRIORITY, T_JOINABLE);
if (ret) {
fprintf(stderr, "Failed to create consumer task: %s\n", strerror(-ret));
rt_task_delete(&consumer_task);
rt_task_delete(&producer_task);
rt_cond_delete(&cond);
rt_mutex_delete(&mutex);
return EXIT_FAILURE;
}
// 启动任务
rt_task_start(&producer_task, &producer, NULL);
rt_task_start(&consumer_task, &consumer, NULL);
rt_task_start(&another_task, &another_consumer, NULL);
rt_task_join(&producer_task);
rt_task_join(&consumer_task);
rt_task_join(&another_task);
rt_cond_delete(&cond);
rt_mutex_delete(&mutex);
return EXIT_SUCCESS;
}
int rt_cond_create (RT_COND *cond, const char *name);
创建一个条件变量。
创建一个同步对象,允许任务挂起执行,直到满足对某些共享数据的某种谓词。
参数
返回值
成功时返回零。否则:
注意
超时值被解释为 Alchemy 时钟分辨率的倍数(参见 alchemy-clock-resolution 选项,默认为1纳秒)。
注意
如果底层线程库不支持 pthread_condattr_setclock(),则使用 Alchemy 条件变量的计时将基于 CLOCK_REALTIME,并因此可能受到系统日期更新(例如 NTP)的影响。这通常涉及基于 linuxthreads 库的旧版设置。在正常情况下,计时基于 CLOCK_MONOTONIC。
标签
xthread-only
, mode-unrestricted
, switch-secondary
示例代码
#include <stdio.h>
#include <stdlib.h>
#include <alchemy/task.h>
#include <alchemy/mutex.h>
#include <alchemy/cond.h>
#define TASK_STACK_SIZE 0 // 使用默认栈大小
#define TASK_PRIORITY 50 // 中等优先级
RT_TASK producer_task, consumer_task;
RT_MUTEX mutex;
RT_COND cond;
int shared_data = 0;
int data_ready = 0;
void producer(void *arg)
{
rt_task_sleep(1000000000); // 睡眠1秒
while (shared_data < 5) {
rt_mutex_acquire(&mutex, TM_INFINITE);
shared_data++;
printf("Producer: produced data %d\n", shared_data);
data_ready = 1;
rt_cond_signal(&cond);
rt_mutex_release(&mutex);
rt_task_sleep(1000000000); // 睡眠1秒
}
}
void consumer(void *arg)
{
while (shared_data < 5) {
rt_mutex_acquire(&mutex, TM_INFINITE);
while (!data_ready) {
rt_cond_wait(&cond, &mutex, TM_INFINITE);
}
printf("Consumer: consumed data %d\n", shared_data);
data_ready = 0;
rt_mutex_release(&mutex);
}
}
int main(int argc, char *argv[])
{
int ret;
// 创建互斥锁
ret = rt_mutex_create(&mutex, "example_mutex");
if (ret) {
fprintf(stderr, "Failed to create mutex: %s\n", strerror(-ret));
return EXIT_FAILURE;
}
// 创建条件变量
ret = rt_cond_create(&cond, "example_cond");
if (ret) {
fprintf(stderr, "Failed to create condition variable: %s\n", strerror(-ret));
rt_mutex_delete(&mutex);
return EXIT_FAILURE;
}
// 创建生产者任务
ret = rt_task_create(&producer_task, "producer", TASK_STACK_SIZE, TASK_PRIORITY, T_JOINABLE);
if (ret) {
fprintf(stderr, "Failed to create producer task: %s\n", strerror(-ret));
rt_cond_delete(&cond);
rt_mutex_delete(&mutex);
return EXIT_FAILURE;
}
// 创建消费者任务
ret = rt_task_create(&consumer_task, "consumer", TASK_STACK_SIZE, TASK_PRIORITY, T_JOINABLE);
if (ret) {
fprintf(stderr, "Failed to create consumer task: %s\n", strerror(-ret));
rt_task_delete(&producer_task);
rt_cond_delete(&cond);
rt_mutex_delete(&mutex);
return EXIT_FAILURE;
}
// 启动任务
rt_task_start(&producer_task, &producer, NULL);
rt_task_start(&consumer_task, &consumer, NULL);
rt_task_join(&producer_task);
rt_task_join(&consumer_task);
rt_cond_delete(&cond);
rt_mutex_delete(&mutex);
return EXIT_SUCCESS;
}
int rt_cond_delete (RT_COND *cond);
删除一个条件变量。
此例程删除由 rt_cond_create() 调用先前创建的条件变量对象。
参数
返回值
成功时返回零。否则:
标签
mode-unrestricted
, switch-secondary
示例代码
#include <stdio.h>
#include <stdlib.h>
#include <alchemy/task.h>
#include <alchemy/mutex.h>
#include <alchemy/cond.h>
#define TASK_STACK_SIZE 0 // 使用默认栈大小
#define TASK_PRIORITY 50 // 中等优先级
RT_TASK producer_task, consumer_task;
RT_MUTEX mutex;
RT_COND cond;
int shared_data = 0;
int data_ready = 0;
void producer(void *arg)
{
rt_task_sleep(1000000000); // 睡眠1秒
while (shared_data < 5) {
rt_mutex_acquire(&mutex, TM_INFINITE);
shared_data++;
printf("Producer: produced data %d\n", shared_data);
data_ready = 1;
rt_cond_signal(&cond);
rt_mutex_release(&mutex);
rt_task_sleep(1000000000); // 睡眠1秒
}
}
void consumer(void *arg)
{
while (shared_data < 5) {
rt_mutex_acquire(&mutex, TM_INFINITE);
while (!data_ready) {
rt_cond_wait(&cond, &mutex, TM_INFINITE);
}
printf("Consumer: consumed data %d\n", shared_data);
data_ready = 0;
rt_mutex_release(&mutex);
}
}
int main(int argc, char *argv[])
{
int ret;
// 创建互斥锁
ret = rt_mutex_create(&mutex, "example_mutex");
if (ret) {
fprintf(stderr, "Failed to create mutex: %s\n", strerror(-ret));
return EXIT_FAILURE;
}
// 创建条件变量
ret = rt_cond_create(&cond, "example_cond");
if (ret) {
fprintf(stderr, "Failed to create condition variable: %s\n", strerror(-ret));
rt_mutex_delete(&mutex);
return EXIT_FAILURE;
}
// 创建生产者任务
ret = rt_task_create(&producer_task, "producer", TASK_STACK_SIZE, TASK_PRIORITY, T_JOINABLE);
if (ret) {
fprintf(stderr, "Failed to create producer task: %s\n", strerror(-ret));
rt_cond_delete(&cond);
rt_mutex_delete(&mutex);
return EXIT_FAILURE;
}
// 创建消费者任务
ret = rt_task_create(&consumer_task, "consumer", TASK_STACK_SIZE, TASK_PRIORITY, T_JOINABLE);
if (ret) {
fprintf(stderr, "Failed to create consumer task: %s\n", strerror(-ret));
rt_task_delete(&producer_task);
rt_cond_delete(&cond);
rt_mutex_delete(&mutex);
return EXIT_FAILURE;
}
// 启动任务
rt_task_start(&producer_task, &producer, NULL);
rt_task_start(&consumer_task, &consumer, NULL);
rt_task_join(&producer_task);
rt_task_join(&consumer_task);
rt_cond_delete(&cond);
rt_mutex_delete(&mutex);
return EXIT_SUCCESS;
}
int rt_cond_inquire (RT_COND *cond, RT_COND_INFO *info);
查询条件变量状态。
此例程返回指定条件变量的状态信息。
参数
返回值
成功时返回零,并将状态信息写入由 info 指向的结构。否则:
标签
unrestricted
, switch-primary
示例代码
#include <stdio.h>
#include <stdlib.h>
#include <alchemy/task.h>
#include <alchemy/mutex.h>
#include <alchemy/cond.h>
#define TASK_STACK_SIZE 0 // 使用默认栈大小
#define TASK_PRIORITY 50 // 中等优先级
RT_TASK producer_task, consumer_task;
RT_MUTEX mutex;
RT_COND cond;
int shared_data = 0;
int data_ready = 0;
void producer(void *arg)
{
RT_COND_INFO info;
int ret = rt_cond_inquire(&cond,&info);
if(ret!=0)
{
fprintf(stderr, "Failed to get cond inquire: %s\n", strerror(-ret));
}else{
printf("Current Cond Name = %s\n",info.name);
}
rt_task_sleep(1000000000); // 睡眠1秒
while (shared_data < 5) {
rt_mutex_acquire(&mutex, TM_INFINITE);
shared_data++;
printf("Producer: produced data %d\n", shared_data);
data_ready = 1;
rt_cond_signal(&cond);
rt_mutex_release(&mutex);
rt_task_sleep(1000000000); // 睡眠1秒
}
}
void consumer(void *arg)
{
while (shared_data < 5) {
rt_mutex_acquire(&mutex, TM_INFINITE);
while (!data_ready) {
rt_cond_wait(&cond, &mutex, TM_INFINITE);
}
printf("Consumer: consumed data %d\n", shared_data);
data_ready = 0;
rt_mutex_release(&mutex);
}
}
int main(int argc, char *argv[])
{
int ret;
// 创建互斥锁
ret = rt_mutex_create(&mutex, "example_mutex");
if (ret) {
fprintf(stderr, "Failed to create mutex: %s\n", strerror(-ret));
return EXIT_FAILURE;
}
// 创建条件变量
ret = rt_cond_create(&cond, "example_cond");
if (ret) {
fprintf(stderr, "Failed to create condition variable: %s\n", strerror(-ret));
rt_mutex_delete(&mutex);
return EXIT_FAILURE;
}
// 创建生产者任务
ret = rt_task_create(&producer_task, "producer", TASK_STACK_SIZE, TASK_PRIORITY, T_JOINABLE);
if (ret) {
fprintf(stderr, "Failed to create producer task: %s\n", strerror(-ret));
rt_cond_delete(&cond);
rt_mutex_delete(&mutex);
return EXIT_FAILURE;
}
// 创建消费者任务
ret = rt_task_create(&consumer_task, "consumer", TASK_STACK_SIZE, TASK_PRIORITY, T_JOINABLE);
if (ret) {
fprintf(stderr, "Failed to create consumer task: %s\n", strerror(-ret));
rt_task_delete(&producer_task);
rt_cond_delete(&cond);
rt_mutex_delete(&mutex);
return EXIT_FAILURE;
}
// 启动任务
rt_task_start(&producer_task, &producer, NULL);
rt_task_start(&consumer_task, &consumer, NULL);
rt_task_join(&producer_task);
rt_task_join(&consumer_task);
rt_cond_delete(&cond);
rt_mutex_delete(&mutex);
return EXIT_SUCCESS;
}
int rt_cond_signal (RT_COND *cond);
发出条件变量信号。
如果条件变量 cond 处于挂起状态,此例程立即解除阻塞第一个等待任务(按队列优先级顺序)。
参数
返回值
成功时返回零。否则:
标签
unrestricted
, switch-primary
示例代码
#include <stdio.h>
#include <stdlib.h>
#include <alchemy/task.h>
#include <alchemy/mutex.h>
#include <alchemy/cond.h>
#define TASK_STACK_SIZE 0 // 使用默认栈大小
#define TASK_PRIORITY 50 // 中等优先级
RT_TASK producer_task, consumer_task;
RT_MUTEX mutex;
RT_COND cond;
int shared_data = 0;
int data_ready = 0;
void producer(void *arg)
{
rt_task_sleep(1000000000); // 睡眠1秒
while (shared_data < 5) {
rt_mutex_acquire(&mutex, TM_INFINITE);
shared_data++;
printf("Producer: produced data %d\n", shared_data);
data_ready = 1;
rt_cond_signal(&cond);
rt_mutex_release(&mutex);
rt_task_sleep(1000000000); // 睡眠1秒
}
}
void consumer(void *arg)
{
while (shared_data < 5) {
rt_mutex_acquire(&mutex, TM_INFINITE);
while (!data_ready) {
rt_cond_wait(&cond, &mutex, TM_INFINITE);
}
printf("Consumer: consumed data %d\n", shared_data);
data_ready = 0;
rt_mutex_release(&mutex);
}
}
int main(int argc, char *argv[])
{
int ret;
// 创建互斥锁
ret = rt_mutex_create(&mutex, "example_mutex");
if (ret) {
fprintf(stderr, "Failed to create mutex: %s\n", strerror(-ret));
return EXIT_FAILURE;
}
// 创建条件变量
ret = rt_cond_create(&cond, "example_cond");
if (ret) {
fprintf(stderr, "Failed to create condition variable: %s\n", strerror(-ret));
rt_mutex_delete(&mutex);
return EXIT_FAILURE;
}
// 创建生产者任务
ret = rt_task_create(&producer_task, "producer", TASK_STACK_SIZE, TASK_PRIORITY, T_JOINABLE);
if (ret) {
fprintf(stderr, "Failed to create producer task: %s\n", strerror(-ret));
rt_cond_delete(&cond);
rt_mutex_delete(&mutex);
return EXIT_FAILURE;
}
// 创建消费者任务
ret = rt_task_create(&consumer_task, "consumer", TASK_STACK_SIZE, TASK_PRIORITY, T_JOINABLE);
if (ret) {
fprintf(stderr, "Failed to create consumer task: %s\n", strerror(-ret));
rt_task_delete(&producer_task);
rt_cond_delete(&cond);
rt_mutex_delete(&mutex);
return EXIT_FAILURE;
}
// 启动任务
rt_task_start(&producer_task, &producer, NULL);
rt_task_start(&consumer_task, &consumer, NULL);
rt_task_join(&producer_task);
rt_task_join(&consumer_task);
rt_cond_delete(&cond);
rt_mutex_delete(&mutex);
return EXIT_SUCCESS;
}
int rt_cond_unbind (RT_COND *cond);
从条件变量解除绑定。
参数
标签
thread-unrestricted
示例代码
#include <stdio.h>
#include <stdlib.h>
#include <alchemy/task.h>
#include <alchemy/mutex.h>
#include <alchemy/cond.h>
#define TASK_STACK_SIZE 0 // 使用默认栈大小
#define TASK_PRIORITY 50 // 中等优先级
RT_TASK producer_task, consumer_task, another_task;
RT_MUTEX mutex;
RT_COND cond;
int shared_data = 0;
int data_ready = 0;
int data_ready_another = 0;
void producer(void *arg)
{
rt_task_sleep(1000000000); // 睡眠1秒
while (shared_data < 5) {
rt_mutex_acquire(&mutex, TM_INFINITE);
shared_data++;
printf("Producer: produced data %d\n", shared_data);
data_ready = 1;
data_ready_another = 1;
rt_cond_broadcast(&cond);
rt_mutex_release(&mutex);
rt_task_sleep(1000000000); // 睡眠1秒
}
}
void consumer(void *arg)
{
while (shared_data < 5) {
rt_mutex_acquire(&mutex, TM_INFINITE);
while (!data_ready) {
rt_cond_wait(&cond, &mutex, TM_INFINITE);
}
printf("Consumer: consumed data %d\n", shared_data);
data_ready = 0;
rt_mutex_release(&mutex);
}
}
void another_consumer(void *arg)
{
RT_COND cond_bind;
int ret = rt_cond_bind(&cond_bind, "example_cond",TM_INFINITE);
if (ret) {
fprintf(stderr, "Failed to create condition variable: %s\n", strerror(-ret));
return;
}
while (shared_data < 5) {
rt_mutex_acquire(&mutex, TM_INFINITE);
while (!data_ready_another) {
rt_cond_wait(&cond_bind, &mutex, TM_INFINITE);
}
printf("Another_Consumer: consumed data %d\n", shared_data);
data_ready_another = 0;
rt_mutex_release(&mutex);
}
rt_cond_unbind(&cond_bind);
}
int main(int argc, char *argv[])
{
int ret;
// 创建互斥锁
ret = rt_mutex_create(&mutex, "example_mutex");
if (ret) {
fprintf(stderr, "Failed to create mutex: %s\n", strerror(-ret));
return EXIT_FAILURE;
}
// 创建条件变量
ret = rt_cond_create(&cond, "example_cond");
if (ret) {
fprintf(stderr, "Failed to create condition variable: %s\n", strerror(-ret));
rt_mutex_delete(&mutex);
return EXIT_FAILURE;
}
// 创建生产者任务
ret = rt_task_create(&producer_task, "producer", TASK_STACK_SIZE, TASK_PRIORITY, T_JOINABLE);
if (ret) {
fprintf(stderr, "Failed to create producer task: %s\n", strerror(-ret));
rt_cond_delete(&cond);
rt_mutex_delete(&mutex);
return EXIT_FAILURE;
}
// 创建消费者任务
ret = rt_task_create(&consumer_task, "consumer", TASK_STACK_SIZE, TASK_PRIORITY, T_JOINABLE);
if (ret) {
fprintf(stderr, "Failed to create consumer task: %s\n", strerror(-ret));
rt_task_delete(&producer_task);
rt_cond_delete(&cond);
rt_mutex_delete(&mutex);
return EXIT_FAILURE;
}
// 创建另一个消费者任务
ret = rt_task_create(&another_task, "another_consumer", TASK_STACK_SIZE, TASK_PRIORITY, T_JOINABLE);
if (ret) {
fprintf(stderr, "Failed to create consumer task: %s\n", strerror(-ret));
rt_task_delete(&consumer_task);
rt_task_delete(&producer_task);
rt_cond_delete(&cond);
rt_mutex_delete(&mutex);
return EXIT_FAILURE;
}
// 启动任务
rt_task_start(&producer_task, &producer, NULL);
rt_task_start(&consumer_task, &consumer, NULL);
rt_task_start(&another_task, &another_consumer, NULL);
rt_task_join(&producer_task);
rt_task_join(&consumer_task);
rt_task_join(&another_task);
rt_cond_delete(&cond);
rt_mutex_delete(&mutex);
return EXIT_SUCCESS;
}
int rt_cond_wait (RT_COND *cond, RT_MUTEX *mutex, RTIME timeout);
等待条件变量(具有相对标量超时)。
此例程是 rt_cond_wait_timed() 的一个变体,接受以标量值表示的相对超时规范。
参数
标签
xthread-only
, switch-primary
示例代码
#include <stdio.h>
#include <stdlib.h>
#include <alchemy/task.h>
#include <alchemy/mutex.h>
#include <alchemy/cond.h>
#define TASK_STACK_SIZE 0 // 使用默认栈大小
#define TASK_PRIORITY 50 // 中等优先级
RT_TASK producer_task, consumer_task;
RT_MUTEX mutex;
RT_COND cond;
int shared_data = 0;
int data_ready = 0;
void producer(void *arg)
{
rt_task_sleep(1000000000); // 睡眠1秒
while (shared_data < 5) {
rt_mutex_acquire(&mutex, TM_INFINITE);
shared_data++;
printf("Producer: produced data %d\n", shared_data);
data_ready = 1;
rt_cond_signal(&cond);
rt_mutex_release(&mutex);
rt_task_sleep(1000000000); // 睡眠1秒
}
}
void consumer(void *arg)
{
while (shared_data < 5) {
rt_mutex_acquire(&mutex, TM_INFINITE);
while (!data_ready) {
rt_cond_wait(&cond, &mutex, TM_INFINITE);
}
printf("Consumer: consumed data %d\n", shared_data);
data_ready = 0;
rt_mutex_release(&mutex);
}
}
int main(int argc, char *argv[])
{
int ret;
// 创建互斥锁
ret = rt_mutex_create(&mutex, "example_mutex");
if (ret) {
fprintf(stderr, "Failed to create mutex: %s\n", strerror(-ret));
return EXIT_FAILURE;
}
// 创建条件变量
ret = rt_cond_create(&cond, "example_cond");
if (ret) {
fprintf(stderr, "Failed to create condition variable: %s\n", strerror(-ret));
rt_mutex_delete(&mutex);
return EXIT_FAILURE;
}
// 创建生产者任务
ret = rt_task_create(&producer_task, "producer", TASK_STACK_SIZE, TASK_PRIORITY, T_JOINABLE);
if (ret) {
fprintf(stderr, "Failed to create producer task: %s\n", strerror(-ret));
rt_cond_delete(&cond);
rt_mutex_delete(&mutex);
return EXIT_FAILURE;
}
// 创建消费者任务
ret = rt_task_create(&consumer_task, "consumer", TASK_STACK_SIZE, TASK_PRIORITY, T_JOINABLE);
if (ret) {
fprintf(stderr, "Failed to create consumer task: %s\n", strerror(-ret));
rt_task_delete(&producer_task);
rt_cond_delete(&cond);
rt_mutex_delete(&mutex);
return EXIT_FAILURE;
}
// 启动任务
rt_task_start(&producer_task, &producer, NULL);
rt_task_start(&consumer_task, &consumer, NULL);
rt_task_join(&producer_task);
rt_task_join(&consumer_task);
rt_cond_delete(&cond);
rt_mutex_delete(&mutex);
return EXIT_SUCCESS;
}
int rt_cond_wait_timed (RT_COND *cond, RT_MUTEX *mutex, const struct timespec *abs_timeout);
等待条件变量。
此服务原子性地释放互斥量并阻塞调用任务,直到发出条件变量 cond 的信号或发生超时,以先到者为准。在从此服务返回之前,将重新获取互斥量。
参数
返回值
成功时返回零。否则:
标签
xthread-only
, switch-primary
示例代码
#include <stdio.h>
#include <stdlib.h>
#include <alchemy/task.h>
#include <alchemy/mutex.h>
#include <alchemy/cond.h>
#define TASK_STACK_SIZE 0 // 使用默认栈大小
#define TASK_PRIORITY 50 // 中等优先级
RT_TASK producer_task, consumer_task;
RT_MUTEX mutex;
RT_COND cond;
int shared_data = 0;
int data_ready = 0;
void producer(void *arg)
{
rt_task_sleep(1000000000); // 睡眠1秒
while (shared_data < 5) {
rt_mutex_acquire(&mutex, TM_INFINITE);
shared_data++;
printf("Producer: produced data %d\n", shared_data);
data_ready = 1;
rt_cond_signal(&cond);
rt_mutex_release(&mutex);
rt_task_sleep(3000000000); // 睡眠3秒
}
}
void consumer(void *arg)
{
while (shared_data < 5) {
rt_mutex_acquire(&mutex, TM_INFINITE);
while (!data_ready) {
struct timespec ts;
clock_gettime(CLOCK_MONOTONIC, &ts);
ts.tv_sec += 2;
int ret = rt_cond_wait_timed(&cond, &mutex, &ts);
if (ret == -ETIMEDOUT) {
printf("Consumer: Wait timed out.\n");
}else if (ret == 0){
printf("Consumer: Condition variable signaled\n");
}else{
printf("Consumer: Something went wrong\n");
}
}
printf("Consumer: consumed data %d\n", shared_data);
data_ready = 0;
rt_mutex_release(&mutex);
}
}
int main(int argc, char *argv[])
{
int ret;
// 创建互斥锁
ret = rt_mutex_create(&mutex, "example_mutex");
if (ret) {
fprintf(stderr, "Failed to create mutex: %s\n", strerror(-ret));
return EXIT_FAILURE;
}
// 创建条件变量
ret = rt_cond_create(&cond, "example_cond");
if (ret) {
fprintf(stderr, "Failed to create condition variable: %s\n", strerror(-ret));
rt_mutex_delete(&mutex);
return EXIT_FAILURE;
}
// 创建生产者任务
ret = rt_task_create(&producer_task, "producer", TASK_STACK_SIZE, TASK_PRIORITY, T_JOINABLE);
if (ret) {
fprintf(stderr, "Failed to create producer task: %s\n", strerror(-ret));
rt_cond_delete(&cond);
rt_mutex_delete(&mutex);
return EXIT_FAILURE;
}
// 创建消费者任务
ret = rt_task_create(&consumer_task, "consumer", TASK_STACK_SIZE, TASK_PRIORITY, T_JOINABLE);
if (ret) {
fprintf(stderr, "Failed to create consumer task: %s\n", strerror(-ret));
rt_task_delete(&producer_task);
rt_cond_delete(&cond);
rt_mutex_delete(&mutex);
return EXIT_FAILURE;
}
// 启动任务
rt_task_start(&producer_task, &producer, NULL);
rt_task_start(&consumer_task, &consumer, NULL);
rt_task_join(&producer_task);
rt_task_join(&consumer_task);
rt_cond_delete(&cond);
rt_mutex_delete(&mutex);
return EXIT_SUCCESS;
}
int rt_cond_wait_until (RT_COND *cond, RT_MUTEX *mutex, RTIME timeout);
等待条件变量(具有绝对标量超时)。
此例程是 rt_cond_wait_timed() 的一个变体,接受以标量值表示的绝对超时规范。
参数
标签
xthread-only
, switch-primary
示例代码
#include <stdio.h>
#include <stdlib.h>
#include <alchemy/task.h>
#include <alchemy/mutex.h>
#include <alchemy/cond.h>
#define TASK_STACK_SIZE 0 // 使用默认栈大小
#define TASK_PRIORITY 50 // 中等优先级
RT_TASK producer_task, consumer_task;
RT_MUTEX mutex;
RT_COND cond;
int shared_data = 0;
int data_ready = 0;
void producer(void *arg)
{
rt_task_sleep(1000000000); // 睡眠1秒
while (shared_data < 5) {
rt_mutex_acquire(&mutex, TM_INFINITE);
shared_data++;
printf("Producer: produced data %d\n", shared_data);
data_ready = 1;
rt_cond_signal(&cond);
rt_mutex_release(&mutex);
rt_task_sleep(3000000000); // 睡眠3秒
}
}
void consumer(void *arg)
{
while (shared_data < 5) {
rt_mutex_acquire(&mutex, TM_INFINITE);
while (!data_ready) {
RTIME timeout = rt_timer_read() + 2000000000;
int ret = rt_cond_wait_until(&cond, &mutex, timeout);
if (ret == -ETIMEDOUT) {
printf("Consumer: Wait timed out.\n");
}else if (ret == 0){
printf("Consumer: Condition variable signaled\n");
}else{
printf("Consumer: Something went wrong\n");
}
}
printf("Consumer: consumed data %d\n", shared_data);
data_ready = 0;
rt_mutex_release(&mutex);
}
}
int main(int argc, char *argv[])
{
int ret;
// 创建互斥锁
ret = rt_mutex_create(&mutex, "example_mutex");
if (ret) {
fprintf(stderr, "Failed to create mutex: %s\n", strerror(-ret));
return EXIT_FAILURE;
}
// 创建条件变量
ret = rt_cond_create(&cond, "example_cond");
if (ret) {
fprintf(stderr, "Failed to create condition variable: %s\n", strerror(-ret));
rt_mutex_delete(&mutex);
return EXIT_FAILURE;
}
// 创建生产者任务
ret = rt_task_create(&producer_task, "producer", TASK_STACK_SIZE, TASK_PRIORITY, T_JOINABLE);
if (ret) {
fprintf(stderr, "Failed to create producer task: %s\n", strerror(-ret));
rt_cond_delete(&cond);
rt_mutex_delete(&mutex);
return EXIT_FAILURE;
}
// 创建消费者任务
ret = rt_task_create(&consumer_task, "consumer", TASK_STACK_SIZE, TASK_PRIORITY, T_JOINABLE);
if (ret) {
fprintf(stderr, "Failed to create consumer task: %s\n", strerror(-ret));
rt_task_delete(&producer_task);
rt_cond_delete(&cond);
rt_mutex_delete(&mutex);
return EXIT_FAILURE;
}
// 启动任务
rt_task_start(&producer_task, &producer, NULL);
rt_task_start(&consumer_task, &consumer, NULL);
rt_task_join(&producer_task);
rt_task_join(&consumer_task);
rt_cond_delete(&cond);
rt_mutex_delete(&mutex);
return EXIT_SUCCESS;
}