PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : Funktion ohne Unterbrechung



debbi1
19.10.2004, 10:53
Hallo C2-Freaks,

wie schaffe ich es, dass eine Funktion oder ein Block von Anweisungen in einem Thread NIE durch andere Threads/Tasks unterbrochen werden kann?

Danke für die Hilfe!

Gruß

nestler
21.10.2004, 11:09
hmm...

meine lösungsidee wäre, alle anderen threads anzuhalten, die funktion
zu berechnen und alle anderen threads fortzusetzen.

das müsste eigentlich so funktionieren. - mit prioritäten kommst du
vermutlich in dem fall nicht weiter...

warum ist es denn so wichtig, dass die anderen threads gar nicht mehr
dran kommen?

gruss,
simon

debbi1
22.10.2004, 10:13
hallo nestler,


warum ist es denn so wichtig, dass die anderen threads gar nicht mehr dran kommen?

... weil in der speziellen Funktion einzelne Bits seriell ausgegeben werden, was nicht unterbrochen werden darf.

Gruß debbi1

debbi1
31.10.2004, 15:31
...??? [-(

Hat denn keiner 'ne Idee??? :-k

Hier ein ständchen für Ideen: :-({|= :-({|=

Gruß debbi1

ACU
31.10.2004, 20:59
Du musst erstmal sagen, wieso der Bereich nicht unterbrochen werden darf.
Poste am Besten mal deinen Quelltext. Dann kann ich dir konkret helfen.
Vielleicht ist es garnicht notwendig eine Unterbrechung zu verhindern.

MfG ACU

nestler
04.11.2004, 10:07
auch wenn einzelne bits seriell ausgegeben werden sollen,
kann die cc2 in der zwischenzeit noch was anderes machen
- oder irre ich mich?

sonst würde ja multithreading keinen sinn machen - wenn
immer nur eine sache auf einmal getan werden kann

oder ist das senden so zeitkritisch?

ACU
04.11.2004, 17:21
ja du hast Recht!
Die CC2 hat eigentlich noch relativ große Reserven.
Ich hatte noch nie Probleme beim senden, während andere Programme gleichzeitig liefen.
Da war eher die Schnittstelle der Flaschenhals.

debbi1
21.11.2004, 12:07
Ok, ok ACU und nestler,
ich habe verstanden: Die CC2 ist schnell genug.

Aber mich interessiert das Ding doch noch:
Wenn ich die CC2-Anleitung lese, gibt es ja da die Befehle capture und release. Sie sollen verwendbar sein, wenn z.B. 2 threads eine Resource (serielle Schnittstelle ...) benutzen wollen und es dann ja ein Zugriffsmischmasch geben könnte.

Ist es damit nich auch möglich, einen thread-Teil oder eine Funktion "ununterbrechbar" zu machen??? :-k

Gruß debbi1

21.11.2004, 12:29
Wenn du eine derartiges Problem ein für alle mal lösen willst, mußt du dir sowas wie ein "ressource Lock" implementieren. Es gibt mindestens 364 varianten, stichwort "MUTEX", das heißt, es gibt einen (globalen) Flag, den kann immer nur einer setzen (deine geschützte Routine z.b) und die anderen Threads fragen das ab, bevor sie im geschützen Bereich rumfummeln und lassen es dann von sich aus bleiben, bis der Flag wieder frei ist. ( so in etwa halt). mfg robert

nestler
21.11.2004, 17:44
stimmt, das ist eine gute lösung - kenne das unter dem stichwort
semaphor... das einzige, worauf man aufpassen muss, ist, dass kein
"deadlock" auftreten kann.
(d.h. thread a und b brauchen z.b. beide resource 1 und 2, thread a
reserviert z.b. resource 2 und thread b resource 1, nun kann keiner
mehr arbeiten, da jeder thread wartet bis die andere ressource frei-
gegeben wird.)

bei komplexeren programmen kann das schon etwas knifflig werden...

wobei der thread natürlich in dieser lösung durchaus unterbrochen wird -
durch alle anderen threads. diese müssen nur unter umständen warten,
da die benötigte resource (bzw. das flag) nicht frei ist...

21.11.2004, 18:16
Haarscharf. Semaphor ist das mit der Warteschlange, Mutex ist etwas einfacher (Rollbalken zu, und alle kommen halt ein anderes Mal wieder)
Die Implementierung ist zwar einmal Arbeit, aber dann hast du ein Werkzeug für alle derartigen Probleme. Schließlich ist jedes Trumm Hardware ist eine Ressource, um die sich alle Threads raufen müssen.
Das mit dem Deadlock ist auch richtig, das braucht etwas Disziplin, aber die hamma ja. oder mfg robert