Alle Abfragen in eine Zeile gestopft. Wozu gibt es Funktionen? Ruhig auslagern und alles schön benennen. (Also kapseln)
Unübersichtlich du hast viele if-Blöcke, der Status erhöht sich da random, dann dort mal. Sowas solltest du sequenziell abarbeiten. Versuche keine if-Trees zu bauen:
Inhalte von externen Seiten werden ohne Ihre Zustimmung nicht automatisch geladen und angezeigt.
Durch die Aktivierung der externen Inhalte erklären Sie sich damit einverstanden, dass personenbezogene Daten an Drittplattformen übermittelt werden. Mehr Informationen dazu haben wir in unserer Datenschutzerklärung zur Verfügung gestellt.
Der Grund von 1 & 2 sorgen dann für das Deadlock. Weil du selbst nicht mehr überblickst, wo jetzt welcher Status gesetzt wird und er wann wohin wandert...
Anfangs ist man noch sehr darauf bedacht jedes Byte und jeden CPU Zyklus zu sichern.
Ich verstehe nicht, wofür du die status Variable benötigst. Ich verstehe weiterhin nicht, wofür du die enter Variable brauchst.
Weiterhin verstehe ich nicht, wofür du die "Kollision Variable" brauchst. Der Plan ist doch, dass sowas nicht stattfinden kann, oder etwa nicht?
Wieso dann nicht z.B. einfach so lösen?
//Edit: Funktioniert nicht, außer als wenn ticket eine atomare Variable ist.
C
#define _DEFAULT_SOURCE
#include <unistd.h>
#include <stdlib.h>
#include <stdio.h>
#include <pthread.h>
#include <time.h>
#define NUM_THREADS 5
#define sle 0.01
#define crosses 100
clock_t start_t, end_t;
volatile long ticket;
int bridge_crosses;
void lock (long tid) {
while(ticket != -1)
{
printf("Thread [%ld] waiting...\n",tid);
sleep(sle);
}
ticket = tid;
}
void unlock (long tid) {
printf("Thread [%ld] unlocked!\n", tid);
ticket=-1;
}
void *bridge_scenario (void *threadid)
{
long tid = (long) threadid;
printf ("Hello World! It's me, thread #%ld !\n", tid);
while (bridge_crosses < crosses) {
lock(tid);
printf("Car [%ld] crossing the road...\n", tid);
sleep(sle);
unlock(tid);
bridge_crosses += 1;
sleep(sle);
}
pthread_exit (NULL);
}
int main()
{
start_t = clock();
pthread_t threads[NUM_THREADS];
long t;
// init data
bridge_crosses = 0;
ticket = -1;
for (t = 0; t < NUM_THREADS; t++) {
printf ("In main: creating thread %ld\n", t);
int rc = pthread_create(&threads[t], NULL, bridge_scenario, (void *)t);
if (rc) {
printf ("ERROR; return code from pthread_create () is %d\n", rc);
exit (-1);
}
}
// joining threads
for (t = 0; t < NUM_THREADS; t++) {
pthread_join(threads[t], NULL);
}
// output
end_t = clock();
double total_t = (double)(end_t - start_t) / CLOCKS_PER_SEC;
printf ("bridge crosses: %d\n time: %f \n", bridge_crosses, total_t);
/* Last thing that main() should do */
pthread_exit (NULL);
return 0;
}
Alles anzeigen
So könntest z.B. auch ganz einfach zählen, wie oft welches Auto gerade drübergefahren ist.
Und es kann so zu keinen Kollisionen kommen.
Der Grund btw, wieso das ohne das printf bei dir nicht funktioniert ist der, dass der Compiler die Variablen und Abfragen wegoptimiert 😄 Auf -O2 denkt der sich, ach, das brauch der nicht, weg damit xD
Damit das nicht passiert, musst du sie volatile setzen, dann lässt der Compiler die Finger davon
Mogly1 Noch schlechter hätte man die Frage glaube wirklich nicht formulieren können.
Was genau möchtest du erreichen.
Erkläre doch mal mehr zu deinem Code. Was genau geht denn nicht? Die printf sind ja ausgeklammert, da wird also nichts ausgegeben. Wieso geht denn das nicht?
Was soll das random Semikolon da? Soll das eine Endlosschleife sein? Dieser Code ist maximal dirty.
Ja, das sind nur Warnings, die kannst du eig ignorieren.
Beheben tust du sie entweder, indem du deine MySQL Version updatest (empfohlen).
Oder du bearbeitest das a_mysql.inc, denn da kommen die Warnings her, das hat nichts mit deinem Code zu tun.
Dort werden Strings in den Funktionen übergeben, als Beispiel:
C++
native MySQL:mysql_connect(host[], user[], password[], database[], MySQLOpt:option_id = MySQLOpt:0);//So steht es da
native MySQL:mysql_connect(const host[], const user[], const password[], const database[], MySQLOpt:option_id = MySQLOpt:0); //So müsste es aussehen
Also immer wenn Strings (bzw Arrays) übergeben werden, also wenn diese eckigen Klammern bei den Parametern verwendet werden, sollte man ein const verwenden, wenn diese in der Funktion nicht verändert werden
weiß jemand woran das liegt und kann mir evtl helfen?
Wieso in aller Wellt sollte das query const sein?
const bedeutet, der Wert ist konstant und ändert sich nicht. Aber da du das hier bei der Deklaration verwendest und der "Variable" keinen Wert zuweist, wäre das immer leer...
Das sind im Gegensatz zu ChatGPT auch tatsächlich sehr flexible Systeme. Sprache an sich hat viele Regeln, die klar strukturiert sind. Das macht eine solche Implementierung weniger Komplex als ein Straßenverlauf.
Nur als Info, das kann man so pauschal gar nicht sagen.
Wenn man vom reinen DNN spricht, ist ChatGPT deutlich größer und komplexer, als die für ein autonomes Fahrzeug.
Sind ja aber völlig unterschiedliche Anwendungszwecke, deshalb ist das nicht so zu vergleichen.
Inhalte von externen Seiten werden ohne Ihre Zustimmung nicht automatisch geladen und angezeigt.
Durch die Aktivierung der externen Inhalte erklären Sie sich damit einverstanden, dass personenbezogene Daten an Drittplattformen übermittelt werden. Mehr Informationen dazu haben wir in unserer Datenschutzerklärung zur Verfügung gestellt.
Hast du da am Anfang die Änderungen an der Client-Config auch vorgenommen?
Wenn nicht, check das mal aus und teste evtl das auch mit dem Chat. Vermutlich stimmt da etwas bei der Einrichtung nicht.
Und weiterhin sagen wir in der Datenbank gibt es 2 Spieler, die du abfragst.
Dann ist der row_count = 2 und der field_count = 3
Also wenn Rows = 0 ist, dann wissen wir, dass kein Spieler gefunden wurde. Das ist die wichtige Information.
Wie viele Felder zurückkommen, wenn Rows zurückkommen, wissen wir eig eh schon immer, da wir sie im Query spezifizieren.
Aus diesem Grund ist diese Info eig unnötig und wurde dann später ausgelagert in eine andere Funktion.
Falls du aus irgendwelchen Gründen das auch wissen magst, gibt es die: cache_get_field_count Funktion, welche genauso funktioniert wie die row_count Funktion
Ein gutes, performantes, sauberes SA:MP Skript zu entwickeln ist ein sehr langwieriger Prozess. Ich weiß nicht, wieso man sich im Jahr 2023 diesen struggle noch antun sollte. Niemand wird dich dafür lobpreisen, es wird keine User geben, welche das zu schätzen wissen. Vermutlich wird es gar keine User geben.
Als Übung ist es natürlich interessant, aber vielleicht gäbe es da Projekte, bei denen auch mehr Leute einen Nutzen von haben.
Inhalte von externen Seiten werden ohne Ihre Zustimmung nicht automatisch geladen und angezeigt.
Durch die Aktivierung der externen Inhalte erklären Sie sich damit einverstanden, dass personenbezogene Daten an Drittplattformen übermittelt werden. Mehr Informationen dazu haben wir in unserer Datenschutzerklärung zur Verfügung gestellt.