POSIX 风格的互斥服务。
POSIX 风格的互斥服务。
互斥锁是一个 MUTual EXclusion 对象,用于保护共享数据结构免受并发修改,并实现临界区和监视器。
互斥锁有两种可能的状态:未锁定(未被任何任务拥有)和已锁定(被一个任务拥有)。互斥锁永远不能同时被两个不同的任务拥有。尝试锁定已被其他任务锁定的互斥锁的任务将被阻塞,直到后者先解锁互斥锁。
xkernel 互斥服务强制执行优先级继承协议以解决优先级反转问题。
int rt_mutex_acquire (RT_MUTEX *mutex, RTIME timeout);
获取/锁定互斥锁(具有相对标量超时)。
此例程是 rt_mutex_acquire_timed() 的一个变体,接受以标量值表示的相对超时规范。
参数
标签
xthread-only, switch-primary
示例代码
#include <stdio.h>
#include <stdlib.h>
#include <alchemy/task.h>
#include <alchemy/mutex.h>
#define TASK_PRIO 50
#define TASK_MODE T_JOINABLE
#define TASK_STKSZ 0
RT_MUTEX mutex;
int shared_resource = 0;
void task_function(void *arg)
{
    int task_id = (int)(long)arg;
    int ret;
    
    printf("Task %d: Try to acquire mutex...\n", task_id);
    
    ret = rt_mutex_acquire(&mutex, TM_INFINITE);
    if (ret) {
        fprintf(stderr, "Task: rt_mutex_acquire %s\n", strerror(-ret));
        return;
    }
    
    printf("Task %d: Successfully acquired the mutex\n", task_id);
    
    // 访问共享资源
    shared_resource++;
    printf("Task %d: Increase the shared resource value to %d\n", task_id, shared_resource);
    
    // 模拟工作
    rt_task_sleep(1000000000);  // 睡眠1秒
    
    printf("Task %d: Release the mutex\n", task_id);
    ret = rt_mutex_release(&mutex);
    if (ret) {
       fprintf(stderr, "Task: rt_mutex_release %s\n", strerror(-ret));
    }
}
int main(int argc, char *argv[])
{
    RT_TASK task1, task2;
    int ret;
    // 创建互斥锁
    ret = rt_mutex_create(&mutex, "MyMutex");
    if (ret) {
        fprintf(stderr, "Task: rt_mutex_create %s\n", strerror(-ret));
        return EXIT_FAILURE;
    }
    // 创建任务1
    ret = rt_task_create(&task1, "Task1", TASK_STKSZ, TASK_PRIO, TASK_MODE);
    if (ret) {
        fprintf(stderr, "Task: rt_task_create %s\n", strerror(-ret));
        rt_mutex_delete(&mutex);
        return EXIT_FAILURE;
    }
    // 创建任务2
    ret = rt_task_create(&task2, "Task2", TASK_STKSZ, TASK_PRIO, TASK_MODE);
    if (ret) {
        fprintf(stderr, "Task: rt_task_create %s\n", strerror(-ret));
        rt_mutex_delete(&mutex);
        rt_task_delete(&task1);
        return EXIT_FAILURE;
    }
    // 启动任务
    rt_task_start(&task1, &task_function, (void *)1);
    rt_task_start(&task2, &task_function, (void *)2);
    // 等待任务完成
    rt_task_join(&task1);
    rt_task_join(&task2);
    // 清理
    rt_mutex_delete(&mutex);
    rt_task_delete(&task1);
    rt_task_delete(&task2);
    printf("Final shared resource value: %d\n", shared_resource);
    return EXIT_SUCCESS;
}
        int rt_mutex_acquire_timed (RT_MUTEX *mutex, const struct timespec *abs_timeout);
获取/锁定互斥锁(具有绝对超时日期)。
尝试锁定互斥锁。调用任务被阻止,直到互斥锁可用,在这种情况下,它会在该服务返回之前再次被锁定。xkernel 互斥锁是隐式递归的,并实现优先级继承协议。
参数
返回值
成功时返回零。否则:
标签
xthread-only, switch-primary
示例代码
#include <stdio.h>
#include <stdlib.h>
#include <alchemy/task.h>
#include <alchemy/mutex.h>
#define TASK_PRIO 50
#define TASK_MODE T_JOINABLE
#define TASK_STKSZ 0
RT_MUTEX mutex;
int shared_resource = 0;
void task_function(void *arg)
{
    int task_id = (int)(long)arg;
    int ret;
    
    printf("Task %d: Try to acquire mutex...\n", task_id);
    struct timespec ts;
    clock_gettime(CLOCK_MONOTONIC, &ts);
    ts.tv_sec += 2;  // 2 seconds
    ret = rt_mutex_acquire_timed(&mutex, &ts);
    if (ret) {
        fprintf(stderr, "Task: rt_mutex_acquire %s\n", strerror(-ret));
        return;
    }
    
    printf("Task %d: Successfully acquired the mutex\n", task_id);
    
    // 访问共享资源
    shared_resource++;
    printf("Task %d: Increase the shared resource value to %d\n", task_id, shared_resource);
    
    // 模拟工作
    rt_task_sleep(1000000000);  // 睡眠1秒
    
    printf("Task %d: Release the mutex\n", task_id);
    ret = rt_mutex_release(&mutex);
    if (ret) {
       fprintf(stderr, "Task: rt_mutex_release %s\n", strerror(-ret));
    }
}
int main(int argc, char *argv[])
{
    RT_TASK task1, task2;
    int ret;
    // 创建互斥锁
    ret = rt_mutex_create(&mutex, "MyMutex");
    if (ret) {
        fprintf(stderr, "Task: rt_mutex_create %s\n", strerror(-ret));
        return EXIT_FAILURE;
    }
    // 创建任务1
    ret = rt_task_create(&task1, "Task1", TASK_STKSZ, TASK_PRIO, TASK_MODE);
    if (ret) {
        fprintf(stderr, "Task: rt_task_create %s\n", strerror(-ret));
        rt_mutex_delete(&mutex);
        return EXIT_FAILURE;
    }
    // 创建任务2
    ret = rt_task_create(&task2, "Task2", TASK_STKSZ, TASK_PRIO, TASK_MODE);
    if (ret) {
        fprintf(stderr, "Task: rt_task_create %s\n", strerror(-ret));
        rt_mutex_delete(&mutex);
        rt_task_delete(&task1);
        return EXIT_FAILURE;
    }
    // 启动任务
    rt_task_start(&task1, &task_function, (void *)1);
    rt_task_start(&task2, &task_function, (void *)2);
    // 等待任务完成
    rt_task_join(&task1);
    rt_task_join(&task2);
    // 清理
    rt_mutex_delete(&mutex);
    rt_task_delete(&task1);
    rt_task_delete(&task2);
    printf("Final shared resource value: %d\n", shared_resource);
    return EXIT_SUCCESS;
}
        int rt_mutex_acquire_until (RT_MUTEX *mutex, RTIME timeout);
获取/锁定互斥锁(具有绝对标量超时)。
此例程是 rt_mutex_acquire_timed() 的变体,接受以标量值表示的绝对超时规范。
参数
标签
xthread-only, switch-primary
示例代码
#include <stdio.h>
#include <stdlib.h>
#include <alchemy/task.h>
#include <alchemy/mutex.h>
#define TASK_PRIO 50
#define TASK_MODE T_JOINABLE
#define TASK_STKSZ 0
RT_MUTEX mutex;
int shared_resource = 0;
void task_function(void *arg)
{
    int task_id = (int)(long)arg;
    int ret;
    
    printf("Task %d: Try to acquire mutex...\n", task_id);
    RTIME timeout = rt_timer_read() + 2000000000;  // 2 seconds
    ret = rt_mutex_acquire_until(&mutex, timeout);
    if (ret) {
        fprintf(stderr, "Task: rt_mutex_acquire %s\n", strerror(-ret));
        return;
    }
    
    printf("Task %d: Successfully acquired the mutex\n", task_id);
    
    // 访问共享资源
    shared_resource++;
    printf("Task %d: Increase the shared resource value to %d\n", task_id, shared_resource);
    
    // 模拟工作
    rt_task_sleep(1000000000);  // 睡眠1秒
    
    printf("Task %d: Release the mutex\n", task_id);
    ret = rt_mutex_release(&mutex);
    if (ret) {
       fprintf(stderr, "Task: rt_mutex_release %s\n", strerror(-ret));
    }
}
int main(int argc, char *argv[])
{
    RT_TASK task1, task2;
    int ret;
    // 创建互斥锁
    ret = rt_mutex_create(&mutex, "MyMutex");
    if (ret) {
        fprintf(stderr, "Task: rt_mutex_create %s\n", strerror(-ret));
        return EXIT_FAILURE;
    }
    // 创建任务1
    ret = rt_task_create(&task1, "Task1", TASK_STKSZ, TASK_PRIO, TASK_MODE);
    if (ret) {
        fprintf(stderr, "Task: rt_task_create %s\n", strerror(-ret));
        rt_mutex_delete(&mutex);
        return EXIT_FAILURE;
    }
    // 创建任务2
    ret = rt_task_create(&task2, "Task2", TASK_STKSZ, TASK_PRIO, TASK_MODE);
    if (ret) {
        fprintf(stderr, "Task: rt_task_create %s\n", strerror(-ret));
        rt_mutex_delete(&mutex);
        rt_task_delete(&task1);
        return EXIT_FAILURE;
    }
    // 启动任务
    rt_task_start(&task1, &task_function, (void *)1);
    rt_task_start(&task2, &task_function, (void *)2);
    // 等待任务完成
    rt_task_join(&task1);
    rt_task_join(&task2);
    // 清理
    rt_mutex_delete(&mutex);
    rt_task_delete(&task1);
    rt_task_delete(&task2);
    printf("Final shared resource value: %d\n", shared_resource);
    return EXIT_SUCCESS;
}
        int rt_mutex_bind (RT_MUTEX *mutex, 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>
#define TASK_PRIO 50
#define TASK_MODE T_JOINABLE
#define TASK_STKSZ 0
RT_MUTEX mutex;
int shared_resource = 0;
void task_function(void *arg)
{
    int task_id = (int)(long)arg;
    int ret;
    RT_MUTEX mutex_task;
    ret = rt_mutex_bind(&mutex_task, "MyMutex", TM_INFINITE);
    if (ret) {
        fprintf(stderr, "Task: rt_mutex_bind %s\n", strerror(-ret));
        return;
    }
    printf("Task %d: Try to acquire mutex...\n", task_id);
    
    ret = rt_mutex_acquire(&mutex_task, TM_INFINITE);
    if (ret) {
        fprintf(stderr, "Task: rt_mutex_acquire %s\n", strerror(-ret));
        return;
    }
    
    printf("Task %d: Successfully acquired the mutex\n", task_id);
    
    // 访问共享资源
    shared_resource++;
    printf("Task %d: Increase the shared resource value to %d\n", task_id, shared_resource);
    
    // 模拟工作
    rt_task_sleep(1000000000);  // 睡眠1秒
    
    printf("Task %d: Release the mutex\n", task_id);
    ret = rt_mutex_release(&mutex_task);
    if (ret) {
       fprintf(stderr, "Task: rt_mutex_release %s\n", strerror(-ret));
    }
    rt_mutex_unbind(&mutex_task);
}
int main(int argc, char *argv[])
{
    RT_TASK task1, task2;
    int ret;
    // 创建互斥锁
    ret = rt_mutex_create(&mutex, "MyMutex");
    if (ret) {
        fprintf(stderr, "Task: rt_mutex_create %s\n", strerror(-ret));
        return EXIT_FAILURE;
    }
    // 创建任务1
    ret = rt_task_create(&task1, "Task1", TASK_STKSZ, TASK_PRIO, TASK_MODE);
    if (ret) {
        fprintf(stderr, "Task: rt_task_create %s\n", strerror(-ret));
        rt_mutex_delete(&mutex);
        return EXIT_FAILURE;
    }
    // 创建任务2
    ret = rt_task_create(&task2, "Task2", TASK_STKSZ, TASK_PRIO, TASK_MODE);
    if (ret) {
        fprintf(stderr, "Task: rt_task_create %s\n", strerror(-ret));
        rt_mutex_delete(&mutex);
        rt_task_delete(&task1);
        return EXIT_FAILURE;
    }
    // 启动任务
    rt_task_start(&task1, &task_function, (void *)1);
    rt_task_start(&task2, &task_function, (void *)2);
    // 等待任务完成
    rt_task_join(&task1);
    rt_task_join(&task2);
    // 清理
    rt_mutex_delete(&mutex);
    rt_task_delete(&task1);
    rt_task_delete(&task2);
    printf("Final shared resource value: %d\n", shared_resource);
    return EXIT_SUCCESS;
}
        int rt_mutex_create (RT_MUTEX *mutex, const char *name);
创建一个互斥锁。
创建一个互斥对象,允许多个任务同步访问共享资源。互斥锁在创建后处于未锁定状态。
参数
返回值
成功时返回零。否则:
标签
xthread-only, mode-unrestricted, switch-secondary
注意
属于同一 xkernel 会话的多个进程可以共享互斥锁。
示例代码
#include <stdio.h>
#include <stdlib.h>
#include <alchemy/task.h>
#include <alchemy/mutex.h>
#define TASK_PRIO 50
#define TASK_MODE T_JOINABLE
#define TASK_STKSZ 0
RT_MUTEX mutex;
int shared_resource = 0;
void task_function(void *arg)
{
    int task_id = (int)(long)arg;
    int ret;
    
    printf("Task %d: Try to acquire mutex...\n", task_id);
    
    ret = rt_mutex_acquire(&mutex, TM_INFINITE);
    if (ret) {
        fprintf(stderr, "Task: rt_mutex_acquire %s\n", strerror(-ret));
        return;
    }
    
    printf("Task %d: Successfully acquired the mutex\n", task_id);
    
    // 访问共享资源
    shared_resource++;
    printf("Task %d: Increase the shared resource value to %d\n", task_id, shared_resource);
    
    // 模拟工作
    rt_task_sleep(1000000000);  // 睡眠1秒
    
    printf("Task %d: Release the mutex\n", task_id);
    ret = rt_mutex_release(&mutex);
    if (ret) {
       fprintf(stderr, "Task: rt_mutex_release %s\n", strerror(-ret));
    }
}
int main(int argc, char *argv[])
{
    RT_TASK task1, task2;
    int ret;
    // 创建互斥锁
    ret = rt_mutex_create(&mutex, "MyMutex");
    if (ret) {
        fprintf(stderr, "Task: rt_mutex_create %s\n", strerror(-ret));
        return EXIT_FAILURE;
    }
    // 创建任务1
    ret = rt_task_create(&task1, "Task1", TASK_STKSZ, TASK_PRIO, TASK_MODE);
    if (ret) {
        fprintf(stderr, "Task: rt_task_create %s\n", strerror(-ret));
        rt_mutex_delete(&mutex);
        return EXIT_FAILURE;
    }
    // 创建任务2
    ret = rt_task_create(&task2, "Task2", TASK_STKSZ, TASK_PRIO, TASK_MODE);
    if (ret) {
        fprintf(stderr, "Task: rt_task_create %s\n", strerror(-ret));
        rt_mutex_delete(&mutex);
        rt_task_delete(&task1);
        return EXIT_FAILURE;
    }
    // 启动任务
    rt_task_start(&task1, &task_function, (void *)1);
    rt_task_start(&task2, &task_function, (void *)2);
    // 等待任务完成
    rt_task_join(&task1);
    rt_task_join(&task2);
    // 清理
    rt_mutex_delete(&mutex);
    rt_task_delete(&task1);
    rt_task_delete(&task2);
    printf("Final shared resource value: %d\n", shared_resource);
    return EXIT_SUCCESS;
}
        int rt_mutex_delete (RT_MUTEX *mutex);
删除一个互斥锁。
此例程删除由 rt_mutex_create() 调用先前创建的互斥对象。
参数
返回值
成功时返回零。否则:
标签
mode-unrestricted, switch-secondary
示例代码
#include <stdio.h>
#include <stdlib.h>
#include <alchemy/task.h>
#include <alchemy/mutex.h>
#define TASK_PRIO 50
#define TASK_MODE T_JOINABLE
#define TASK_STKSZ 0
RT_MUTEX mutex;
int shared_resource = 0;
void task_function(void *arg)
{
    int task_id = (int)(long)arg;
    int ret;
    
    printf("Task %d: Try to acquire mutex...\n", task_id);
    
    ret = rt_mutex_acquire(&mutex, TM_INFINITE);
    if (ret) {
        fprintf(stderr, "Task: rt_mutex_acquire %s\n", strerror(-ret));
        return;
    }
    
    printf("Task %d: Successfully acquired the mutex\n", task_id);
    
    // 访问共享资源
    shared_resource++;
    printf("Task %d: Increase the shared resource value to %d\n", task_id, shared_resource);
    
    // 模拟工作
    rt_task_sleep(1000000000);  // 睡眠1秒
    
    printf("Task %d: Release the mutex\n", task_id);
    ret = rt_mutex_release(&mutex);
    if (ret) {
       fprintf(stderr, "Task: rt_mutex_release %s\n", strerror(-ret));
    }
}
int main(int argc, char *argv[])
{
    RT_TASK task1, task2;
    int ret;
    // 创建互斥锁
    ret = rt_mutex_create(&mutex, "MyMutex");
    if (ret) {
        fprintf(stderr, "Task: rt_mutex_create %s\n", strerror(-ret));
        return EXIT_FAILURE;
    }
    // 创建任务1
    ret = rt_task_create(&task1, "Task1", TASK_STKSZ, TASK_PRIO, TASK_MODE);
    if (ret) {
        fprintf(stderr, "Task: rt_task_create %s\n", strerror(-ret));
        rt_mutex_delete(&mutex);
        return EXIT_FAILURE;
    }
    // 创建任务2
    ret = rt_task_create(&task2, "Task2", TASK_STKSZ, TASK_PRIO, TASK_MODE);
    if (ret) {
        fprintf(stderr, "Task: rt_task_create %s\n", strerror(-ret));
        rt_mutex_delete(&mutex);
        rt_task_delete(&task1);
        return EXIT_FAILURE;
    }
    // 启动任务
    rt_task_start(&task1, &task_function, (void *)1);
    rt_task_start(&task2, &task_function, (void *)2);
    // 等待任务完成
    rt_task_join(&task1);
    rt_task_join(&task2);
    // 清理
    rt_mutex_delete(&mutex);
    rt_task_delete(&task1);
    rt_task_delete(&task2);
    printf("Final shared resource value: %d\n", shared_resource);
    return EXIT_SUCCESS;
}
        int rt_mutex_inquire (RT_MUTEX *mutex, RT_MUTEX_INFO *info);
查询互斥锁状态。
此例程返回指定互斥锁的状态信息。
参数
返回值
成功时返回零,并将状态信息写入 info 指向的结构体。否则:
标签
xthread-only, switch-primary
示例代码
#include <stdio.h>
#include <stdlib.h>
#include <alchemy/task.h>
#include <alchemy/mutex.h>
#define TASK_PRIO 50
#define TASK_MODE T_JOINABLE
#define TASK_STKSZ 0
RT_MUTEX mutex;
int shared_resource = 0;
void task_function(void *arg)
{
    int task_id = (int)(long)arg;
    int ret;
    RT_MUTEX_INFO info;
    
    printf("Task %d: Try to acquire mutex...\n", task_id);
    
    ret = rt_mutex_inquire(&mutex, &info);
    if (ret) {
        fprintf(stderr, "Task: rt_mutex_inquire %s\n", strerror(-ret));
        return;
    }
    printf("Task %d: Get mutex info\n",task_id);
    printf("Task %d: Name :%s, Owner:%p\n",task_id,info.name,info.owner);
    ret = rt_mutex_acquire(&mutex, TM_INFINITE);
    if (ret) {
        fprintf(stderr, "Task: rt_mutex_acquire %s\n", strerror(-ret));
        return;
    }
    
    printf("Task %d: Successfully acquired the mutex\n", task_id);
    
    // 访问共享资源
    shared_resource++;
    printf("Task %d: Increase the shared resource value to %d\n", task_id, shared_resource);
    
    // 模拟工作
    rt_task_sleep(1000000000);  // 睡眠1秒
    
    printf("Task %d: Release the mutex\n", task_id);
    ret = rt_mutex_release(&mutex);
    if (ret) {
       fprintf(stderr, "Task: rt_mutex_release %s\n", strerror(-ret));
    }
}
int main(int argc, char *argv[])
{
    RT_TASK task1, task2;
    int ret;
    // 创建互斥锁
    ret = rt_mutex_create(&mutex, "MyMutex");
    if (ret) {
        fprintf(stderr, "Task: rt_mutex_create %s\n", strerror(-ret));
        return EXIT_FAILURE;
    }
    // 创建任务1
    ret = rt_task_create(&task1, "Task1", TASK_STKSZ, TASK_PRIO, TASK_MODE);
    if (ret) {
        fprintf(stderr, "Task: rt_task_create %s\n", strerror(-ret));
        rt_mutex_delete(&mutex);
        return EXIT_FAILURE;
    }
    // 创建任务2
    ret = rt_task_create(&task2, "Task2", TASK_STKSZ, TASK_PRIO, TASK_MODE);
    if (ret) {
        fprintf(stderr, "Task: rt_task_create %s\n", strerror(-ret));
        rt_mutex_delete(&mutex);
        rt_task_delete(&task1);
        return EXIT_FAILURE;
    }
    // 启动任务
    rt_task_start(&task1, &task_function, (void *)1);
    rt_task_start(&task2, &task_function, (void *)2);
    // 等待任务完成
    rt_task_join(&task1);
    rt_task_join(&task2);
    // 清理
    rt_mutex_delete(&mutex);
    rt_task_delete(&task1);
    rt_task_delete(&task2);
    printf("Final shared resource value: %d\n", shared_resource);
    return EXIT_SUCCESS;
}
        int rt_mutex_release (RT_MUTEX *mutex);
释放/解锁互斥锁。
此例程释放先前通过调用 rt_mutex_acquire() 或 rt_mutex_acquire_until() 锁定的互斥锁对象。如果互斥锁处于挂起状态,则按优先级顺序立即解除第一个等待任务的阻塞,并将互斥锁的所有权转移给该任务;否则,互斥锁将处于未锁定状态。
参数
返回值
成功时返回零。否则:
标签
xthread-only, switch-primary
示例代码
#include <stdio.h>
#include <stdlib.h>
#include <alchemy/task.h>
#include <alchemy/mutex.h>
#define TASK_PRIO 50
#define TASK_MODE T_JOINABLE
#define TASK_STKSZ 0
RT_MUTEX mutex;
int shared_resource = 0;
void task_function(void *arg)
{
    int task_id = (int)(long)arg;
    int ret;
    
    printf("Task %d: Try to acquire mutex...\n", task_id);
    
    ret = rt_mutex_acquire(&mutex, TM_INFINITE);
    if (ret) {
        fprintf(stderr, "Task: rt_mutex_acquire %s\n", strerror(-ret));
        return;
    }
    
    printf("Task %d: Successfully acquired the mutex\n", task_id);
    
    // 访问共享资源
    shared_resource++;
    printf("Task %d: Increase the shared resource value to %d\n", task_id, shared_resource);
    
    // 模拟工作
    rt_task_sleep(1000000000);  // 睡眠1秒
    
    printf("Task %d: Release the mutex\n", task_id);
    ret = rt_mutex_release(&mutex);
    if (ret) {
       fprintf(stderr, "Task: rt_mutex_release %s\n", strerror(-ret));
    }
}
int main(int argc, char *argv[])
{
    RT_TASK task1, task2;
    int ret;
    // 创建互斥锁
    ret = rt_mutex_create(&mutex, "MyMutex");
    if (ret) {
        fprintf(stderr, "Task: rt_mutex_create %s\n", strerror(-ret));
        return EXIT_FAILURE;
    }
    // 创建任务1
    ret = rt_task_create(&task1, "Task1", TASK_STKSZ, TASK_PRIO, TASK_MODE);
    if (ret) {
        fprintf(stderr, "Task: rt_task_create %s\n", strerror(-ret));
        rt_mutex_delete(&mutex);
        return EXIT_FAILURE;
    }
    // 创建任务2
    ret = rt_task_create(&task2, "Task2", TASK_STKSZ, TASK_PRIO, TASK_MODE);
    if (ret) {
        fprintf(stderr, "Task: rt_task_create %s\n", strerror(-ret));
        rt_mutex_delete(&mutex);
        rt_task_delete(&task1);
        return EXIT_FAILURE;
    }
    // 启动任务
    rt_task_start(&task1, &task_function, (void *)1);
    rt_task_start(&task2, &task_function, (void *)2);
    // 等待任务完成
    rt_task_join(&task1);
    rt_task_join(&task2);
    // 清理
    rt_mutex_delete(&mutex);
    rt_task_delete(&task1);
    rt_task_delete(&task2);
    printf("Final shared resource value: %d\n", shared_resource);
    return EXIT_SUCCESS;
}
        int rt_mutex_unbind (RT_MUTEX *mutex);
解除互斥锁绑定。
参数
此例程释放先前对互斥锁的绑定。此调用返回后,描述符不再有效,无法用于引用该对象。
标签
mode-unrestricted, switch-secondary
示例代码
#include <stdio.h>
#include <stdlib.h>
#include <alchemy/task.h>
#include <alchemy/mutex.h>
#define TASK_PRIO 50
#define TASK_MODE T_JOINABLE
#define TASK_STKSZ 0
RT_MUTEX mutex;
int shared_resource = 0;
void task_function(void *arg)
{
    int task_id = (int)(long)arg;
    int ret;
    RT_MUTEX mutex_task;
    ret = rt_mutex_bind(&mutex_task, "MyMutex", TM_INFINITE);
    if (ret) {
        fprintf(stderr, "Task: rt_mutex_bind %s\n", strerror(-ret));
        return;
    }
    printf("Task %d: Try to acquire mutex...\n", task_id);
    
    ret = rt_mutex_acquire(&mutex_task, TM_INFINITE);
    if (ret) {
        fprintf(stderr, "Task: rt_mutex_acquire %s\n", strerror(-ret));
        return;
    }
    
    printf("Task %d: Successfully acquired the mutex\n", task_id);
    
    // 访问共享资源
    shared_resource++;
    printf("Task %d: Increase the shared resource value to %d\n", task_id, shared_resource);
    
    // 模拟工作
    rt_task_sleep(1000000000);  // 睡眠1秒
    
    printf("Task %d: Release the mutex\n", task_id);
    ret = rt_mutex_release(&mutex_task);
    if (ret) {
       fprintf(stderr, "Task: rt_mutex_release %s\n", strerror(-ret));
    }
    rt_mutex_unbind(&mutex_task);
}
int main(int argc, char *argv[])
{
    RT_TASK task1, task2;
    int ret;
    // 创建互斥锁
    ret = rt_mutex_create(&mutex, "MyMutex");
    if (ret) {
        fprintf(stderr, "Task: rt_mutex_create %s\n", strerror(-ret));
        return EXIT_FAILURE;
    }
    // 创建任务1
    ret = rt_task_create(&task1, "Task1", TASK_STKSZ, TASK_PRIO, TASK_MODE);
    if (ret) {
        fprintf(stderr, "Task: rt_task_create %s\n", strerror(-ret));
        rt_mutex_delete(&mutex);
        return EXIT_FAILURE;
    }
    // 创建任务2
    ret = rt_task_create(&task2, "Task2", TASK_STKSZ, TASK_PRIO, TASK_MODE);
    if (ret) {
        fprintf(stderr, "Task: rt_task_create %s\n", strerror(-ret));
        rt_mutex_delete(&mutex);
        rt_task_delete(&task1);
        return EXIT_FAILURE;
    }
    // 启动任务
    rt_task_start(&task1, &task_function, (void *)1);
    rt_task_start(&task2, &task_function, (void *)2);
    // 等待任务完成
    rt_task_join(&task1);
    rt_task_join(&task2);
    // 清理
    rt_mutex_delete(&mutex);
    rt_task_delete(&task1);
    rt_task_delete(&task2);
    printf("Final shared resource value: %d\n", shared_resource);
    return EXIT_SUCCESS;
}