2012-08-17 12 views
5

Estoy escribiendo una biblioteca compartida en C. Sé que las funciones C no son seguras para hilos.Haciendo que una biblioteca C sea segura

Mis rutinas de biblioteca parece,

struct lib_handle { 
.... 
}; 

int lib_init(lib_handle **handle); 
int lib_process(lib_handle *handle); 
.... 
.... 

Cada método tiene un puntero a lib_handle objeto. Todo el estado se almacena dentro de esta estructura. No se usan variables globales.

Supongo que si cada subproceso crea sus propias instancias lib_handle, varios subprocesos pueden usar las funciones de la biblioteca. Como cada hilo tiene su propio mango, everythibg debería funcionar.

No he validado esta suposición todavía. Me pregunto qué piensan ustedes sobre este diseño y ¿creen que puedo decir que mi biblioteca es segura para subprocesos dado que cada subproceso tiene sus propios identificadores?

¡Cualquier ayuda sería genial!

+0

Esta biblioteca no usa ninguna otra biblioteca que no sea SQLite. SQLite en sí mismo es seguro para subprocesos. –

+0

Oye, +1, finalmente una pregunta sensata. –

Respuesta

3

Eso hará que los datos/el estado de la secuencia de la biblioteca sean seguros.

Pero también debe asegurarse de que su biblioteca utiliza funciones seguras para las hebras de otras bibliotecas, p. Ej. use strtok_r en lugar de strtok.

+0

Sí. Estás en lo correcto. ¿Qué pasa con otras funciones de funciones de biblioteca estándar? –

+0

@Appu En su mayoría, las funciones estándar son seguras para hilos a menos que se indique lo contrario. La mejor manera es mirar la página de manual de la función. – Rohan

1

Threads funciona en el espacio de la memoria compartida. Los objetos inseguros son los objetos a los que se puede acceder mediante varios subprocesos al mismo tiempo. Por lo tanto, si tiene un único objeto lib_handle para cada subproceso, no habrá problemas.

0

Si cada subproceso tiene un objeto privado lib_handle, su biblioteca debe ser totalmente segura para la ejecución de subprocesos; si permite que varios subprocesos compartan objetos lib_handle, la persona que usa su biblioteca puede crear un programa seguro para subprocesos si usa su biblioteca correctamente (es decir, su biblioteca no es intrínsecamente insegura en cuanto a subprocesos, como sería si utilizara, por ejemplo, variables globales).

Si este modo de funcionamiento (shared lib_handle) es interesante, debe separar claramente las funciones que solo leen el estado de lib_handle y las que manipulan el estado de lib_handle. El primero necesita un bloqueo de lectura y este último necesita un bloqueo de escritura (el alcance de la llamada debe manejar esto).

Por lo que vale, he usado el patrón que describes bastante, y me gusta.

Cuestiones relacionadas