如何在C中编写"线程安全"功能?

And*_*anu 1 c thread-safety

您好我在C中编写了一些数据结构,并且我意识到它们的相关函数不是线程安全的.我正在编写代码只使用标准C,我想实现某种"同步".

我当时想做这样的事情:

enum sync_e { TRUE, FALSE };
typedef enum sync_e sync;


struct list_s {
//Other stuff
    struct list_node_s *head;
    struct list_node_s *tail;
    enum sync_e locked;
};
typedef struct list_s list;
Run Code Online (Sandbox Code Playgroud)

,在列表结构中包含一个"布尔"字段,表示结构状态:已锁定,未锁定.

例如,插入函数将以这种方式重写:

int list_insert_next(list* l, list_node *e, int x){
    while(l->locked == TRUE){
        /* Wait */
    }
    l->locked = TRUE;
    /* Insert element */
    /* -------------- */
    l->locked = FALSE;
    return (0);
}
Run Code Online (Sandbox Code Playgroud)

在列表上操作时,"锁定"字段将设置为TRUE,不允许任何其他更改.操作完成后,"锁定"字段将再次设置为"TRUE".

这种做法好吗?您是否了解其他方法(仅使用标准 C).

dme*_*ter 5

标准C不会"知道"有关线程的任何信息.任何与线程本身相关的线程,同步原语,原子操作都不是语言或标准库的一部分.它们始终是POSIX或Windows API的系统库的一部分.

因此,当仅使用标准C的多个线程使用数据结构时,无法保护您的数据结构免受竞争条件的影响.

如果结构的实例仅由单个线程使用,则可以在多线程场景中使用它,例如,不要在函数内使用静态变量.