diff --git a/.obsidian/workspace.json b/.obsidian/workspace.json
index 3d7e473..313ddb3 100644
--- a/.obsidian/workspace.json
+++ b/.obsidian/workspace.json
@@ -20,8 +20,22 @@
"icon": "lucide-file",
"title": "Teoría_2425"
}
+ },
+ {
+ "id": "e654a6996736ae9f",
+ "type": "leaf",
+ "state": {
+ "type": "diff-view",
+ "state": {
+ "file": "TERCERO/SPD/P4_SPD.md",
+ "staged": true
+ },
+ "icon": "git-pull-request",
+ "title": "Diff View (P4_SPD)"
+ }
}
- ]
+ ],
+ "currentTab": 1
}
],
"direction": "vertical"
@@ -175,15 +189,16 @@
"obsidian-git:Open Git source control": false
}
},
- "active": "7d00eaebf5db2f27",
+ "active": "b40a18c39aef8e17",
"lastOpenFiles": [
+ "TERCERO/SPD/P4_SPD.md",
+ "conflict-files-obsidian-git.md",
+ "TERCERO/IA/Teoría_2425.md",
"TERCERO/SS/SS 24-25.md",
"TERCERO/SS/SS Lab.md",
- "TERCERO/SPD/P4_SPD.md",
"TERCERO/SPD/Teoría_2425.md",
"TERCERO/SS/images/Pasted image 20241024113018.png",
"TERCERO/SS/images/Pasted image 20241024090239.png",
- "conflict-files-obsidian-git.md",
"TERCERO/SPD/images/Pasted image 20241022150214.png",
"TERCERO/ATR1/images/Pasted image 20241020204947.png",
"TERCERO/ATR1/images/Pasted image 20241020204701.png",
@@ -192,7 +207,6 @@
"TERCERO/SPD/images/Pasted image 20241022144832.png",
"TERCERO/SPD/images/Pasted image 20241022144429.png",
"TERCERO/SPD/images/Pasted image 20241022134454.png",
- "TERCERO/IA/Teoría_2425.md",
"TERCERO/ATR1/Teoría_2425.md",
"SEGUNDO/ADDA/Teoría_2324.md",
"TERCERO/IA/Apuntes Julia.md",
diff --git a/TERCERO/SS/SS 24-25.md b/TERCERO/SS/SS 24-25.md
index cec6699..2c686dc 100644
--- a/TERCERO/SS/SS 24-25.md
+++ b/TERCERO/SS/SS 24-25.md
@@ -226,21 +226,74 @@ En C/C++ parece fácil: usándolo. La mayoría de SO están escritos en C así q
- Funciones terminadas en W (`MessageBoxW`)
### Tratamiento de errores
Las funciones devuelven un entero, y si este es negativo es que ha terminado con error. Para más información sobre el error se usa `GetLastError()` y para mensajes al usuario `FormatMessage()`.
-# TEMA 5: Control de ejecución: procesos e hilos
-En Windows todos los procesos tienen al menos el "main thread". El programa termina cuando termina el hilo principal. Dos modelos básicos:
-- **Multihilo:** cada proceso tiene múltiples hilos. Típico de Windows aunque se usa cada vez más en UNIX/Linux.
+# TEMA 5: Control de ejecución: procesos e threads
+En Windows todos los procesos tienen al menos el "main thread". El programa termina cuando termina el thread principal. Dos modelos básicos:
+- **Multithread:** cada proceso tiene múltiples threads. Típico de Windows aunque se usa cada vez más en UNIX/Linux.
- **Multiproceso:** múltiples procesos. Típico de UNIX/Linux, aunque también se puede en Windows. En Linux es **muy fácil** usando `fork()`.
-## 1. Operaciones básicas con hilos
-Organizar la ejecución en varios hilos **¿para qué?**
+## 1. Operaciones básicas con threads
+Organizar la ejecución en varios threads **¿para qué?**
EJEMPLO: Programa de proceso de audio
-- **Hilo 1:** lee datos de la entrada de audio, los procesa y envía el resultado a la salida.
+- **thread 1:** lee datos de la entrada de audio, los procesa y envía el resultado a la salida.
- Periódico
- Intensivo en datos
- Requiere velocidad de proceso
- **WORKER THREADS**
-- **Hilo 2:** controla la UI (subir, bajar volumen, play, pause...) Complicado si alguna tarea es bloqueante.
+- **thread 2:** controla la UI (subir, bajar volumen, play, pause...) Complicado si alguna tarea es bloqueante.
- No periódico
- No intensivo
- No requiere velocidad de proceso
- **USER INTERFACE THREAD**
--
\ No newline at end of file
+### Crear un thread
+En Windows se usa `CreateThread()` que devuelve un `HANDLE`. Los elementos que integran el thread son:
+- Función de entrada
+- Parámetro(s)
+- Pila
+- Almacenamiento local al thread
+- El HANDLE y el ID
+Los threads son **asíncronos**.
+#### Ejemplo
+```C
+int main(int argc, char *argv[])
+{
+ setlocale(LC_ALL, "Spanish");
+
+ DWORD Ciclo = 1000; // Ciclo entre pitidos (en ms)
+ DWORD Frecuencia = 500;
+ DWORD Duracion = 100;
+
+ while (TRUE){
+ // bip a frec. y duración que se le pasa
+ Beep(Frecuencia, Duracion);
+ Sleep(Ciclo);
+ }
+
+ printf("\nPulse tecla RETORNO para terminar\n");
+ getchar(); // bloqueo
+ return 0;
+}
+```
+Para evitar el bloqueo, en C++ existen alternativas (en C **NO**), como `std::thread` o `std::async`.
+### Suspender/Reactivar un thread
+El thread se puede suspender o reactivar usando respectivamente `SuspendThread` y `ResumeThread`. El thread está suspendido si el contador != 0.
+### Terminar un thread
+Un thread finaliza cuando termina su función de entrada, cuando se termina a sí mismo con `ExitThread` o cuando lo "terminan" con `TerminateThread`.
+## 2. Organización de los datos en un thread
+Los hilos comparten variables globales y código. También pueden pasarse punteros (posibilidad de errores).
+### Código reentrante
+Código que puede ser usado desde más de un hilo. Se puede aplicar a:
+- Código completo del hilo
+- Algunas funciones
+- Bibliotecas
+Cada instancia de un thread tiene sus propios recursos, los cuales hay que proteger con mecanismos de control de la concurrencia.
+## 3. Creando procesos
+`CreateProcess` crea un proceso concurrente. Algunos puntos a destacar en la descripción de `CreateProcess`:
+- **`IpApplicationName`**: es opcional. Si es `NULL`, el nombre del programa se incluye en el siguiente parámetro.
+- **`IpCommandLine`**: si el path del ejecutable no está, se sigue la secuencia de búsqueda que viene al final de este parámetro.
+- **`IpProcessAttributes, IpThreadAttributes, bInheritHandles, IpEnvironment, IpCurrentDirectory`**: no los usaremos, poner a NULL/FALSE.
+- **`IpStartupInfo`**: la estructura `STARTUPINFO` no la usaremos pero tiene que estar.
+- **`IpProcessInformation`**: rellena la estructura `PROCESS_INFORMATION` con información sobre el proceso y thread creado (handles, process/threads ids).
+## 4. Punto de vista de la programación y procesos POSIX
+- Aunque el proceso creado se le llama "hijo" **no hay relación lógica** entre ambos, al menos en Windows. En UNIX/Linux/POSIX **sí hay**.
+- La creación del proceso es asíncrona, **NO** es una "llamada".
+- En la biblioteca de C: `exec` (UNIX) / `_exec` (Win) funcionan distinto en Windows y UNIX/Linux. En Windows se basa en `CreateProcess` y en UNIX/Linux el proceso actual carga un nuevo programa:
+ - `posix spawn` es lo equivalente a `CreateProcess` que básicamente hace: `fork` + `exec`
\ No newline at end of file
diff --git a/conflict-files-obsidian-git.md b/conflict-files-obsidian-git.md
new file mode 100644
index 0000000..d8bbd4f
--- /dev/null
+++ b/conflict-files-obsidian-git.md
@@ -0,0 +1,17 @@
+# Conflicts
+Please resolve them and commit them using the commands `Git: Commit all changes` followed by `Git: Push`
+(This file will automatically be deleted before commit)
+[[#Additional Instructions]] available below file list
+
+- Not a file: .obsidian/workspace.json
+
+# Additional Instructions
+I strongly recommend to use "Source mode" for viewing the conflicted files. For simple conflicts, in each file listed above replace every occurrence of the following text blocks with the desired text.
+
+```diff
+<<<<<<< HEAD
+ File changes in local repository
+=======
+ File changes in remote repository
+>>>>>>> origin/main
+```
\ No newline at end of file