您好我在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).
标准C不会"知道"有关线程的任何信息.任何与线程本身相关的线程,同步原语,原子操作都不是语言或标准库的一部分.它们始终是POSIX或Windows API的系统库的一部分.
因此,当仅使用标准C的多个线程使用数据结构时,无法保护您的数据结构免受竞争条件的影响.
如果结构的实例仅由单个线程使用,则可以在多线程场景中使用它,例如,不要在函数内使用静态变量.